异或加密是密码学中一种简单的加密算法,常做为更为复杂的加密算法的组成部分。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