密碼學:一.異或加密

異或加密是密碼學中一種簡單的加密算法,常做爲更爲複雜的加密算法的組成部分。php

原理

異或運算:首先異或表示當兩個數用二進制表示,進行異或運算時,當前位的兩個二進制不一樣則爲1相同則爲0。
A ⊕ 0 = A
A ⊕ A = 0
A ⊕ B ⊕ B = A
文本的每一個字符能夠經過與給定的密鑰進行按位異或運算來加密。若是要解密,只須要將加密後的結果與密鑰再次進行按位異或運算便可。golang

異或運算

代碼實踐

golang算法

func main() {
	key := []byte{0x93, 0x44, 0x47, 0xa1, 0x13, 0x3d, 0x34, 0x23, 0xb1, 0x42, 0x11}
	cipher := enc("you are a good person",key)
	fmt.Println(cipher)
	fmt.Println(dec(cipher,key))
}


func enc(src string, key []byte) string {
	var result string
	j := 0
	s := ""
	bt := []rune(src)
	for i := 0; i < len(bt); i++ {
		s = strconv.FormatInt(int64(byte(bt[i])^key[j]), 16)
		if len(s) == 1 {
			s = "0" + s
		}
		result = result + (s)
		j = (j + 1) % len(key)
	}
	return result
}

func dec(src string, key []byte) string {
	var result string
	var s int64
	j := 0
	bt := []rune(src)
	for i := 0; i < len(src)/2; i++ {
		s, _ = strconv.ParseInt(string(bt[i*2:i*2+2]), 16, 0)
		result = result + string(byte(s)^key[j])
		j = (j + 1) % len(key)
	}
	return result
}

php安全

$key = "this is the key";
$content = "you are a good person";
$cipher = enc($content,$key);
var_dump($cipher);
echo dec($cipher, $key);

function enc($str,$key){
    return str_replace('=','',base64_encode($str ^ $key));
}

function dec($str,$key){
    return base64_decode($str) ^ $key;
}

異或密碼值得使用的緣由主要是其易於實現,並且計算成本小。簡單重複異或加密有時用於不須要特別安全的狀況下來隱藏信息。
若是使用不斷重複的密鑰,利用頻率分析就能夠破解這種簡單的異或密碼。一旦消息的內容被猜出或知道,密鑰就會泄露。
若是密鑰是隨機的(不重複),異或密碼就會更爲安全。若密鑰是真正隨機的,結果就是一次性密碼本,這種密碼在理論上是不可破解的。this

相關文章
相關標籤/搜索