詳解XOR 運(yùn)算加密

邏輯運(yùn)算之中,除了 AND 和 OR,還有一種 XOR 運(yùn)算,中文稱為"異或運(yùn)算"。它的定義是:兩個(gè)值相同時(shí),返回false,否則返回true。也就是說,XOR可以用來判斷兩個(gè)值是否不同。
詳解XOR 運(yùn)算加密
詳解XOR 運(yùn)算加密
JavaScript 語言的二進(jìn)制運(yùn)算,有一個(gè)專門的 XOR 運(yùn)算符,寫作^。
詳解XOR 運(yùn)算加密
如果兩個(gè)二進(jìn)制位相同,就返回0,表示false;否則返回1,表示true。

XOR 的應(yīng)用
XOR 運(yùn)算有一個(gè)很奇妙的特點(diǎn):如果對(duì)一個(gè)值連續(xù)做兩次 XOR,會(huì)返回這個(gè)值本身。
詳解XOR 運(yùn)算加密
上面代碼中,原始值是1010,再任意選擇一個(gè)值(上例是1111),做兩次 XOR,最后總是會(huì)得到原始值1010。這在數(shù)學(xué)上是很容易證明的。

加密應(yīng)用
XOR 的這個(gè)特點(diǎn),使得它可以用于信息的加密。
詳解XOR 運(yùn)算加密
上面代碼中,原始信息是message,密鑰是key,第一次 XOR 會(huì)得到加密文本cipherText。對(duì)方拿到以后,再用key做一次 XOR 運(yùn)算,就會(huì)還原得到message。
詳解XOR 運(yùn)算加密

完美保密性
二戰(zhàn)期間,各國為了電報(bào)加密,對(duì)密碼學(xué)進(jìn)行了大量的研究和實(shí)踐,其中就包括 XOR 加密。
戰(zhàn)后,美國數(shù)學(xué)家香農(nóng)將他的研究成果公開發(fā)表,證明了只要滿足兩個(gè)條件,XOR 加密是無法破解的。

key的長度大于等于message
key必須是一次性的,且每次都要隨機(jī)產(chǎn)生

理由很簡單,如果每次的key都是隨機(jī)的,那么產(chǎn)生的CipherText具有所有可能的值,而且是均勻分布,無法從CipherText看出message的任何特征。也就是說,它具有最大的"信息熵",因此完全不可能破解。這被稱為 XOR 的"完美保密性"(perfect secrecy)。
滿足上面兩個(gè)條件的key,叫做 one-time pad(縮寫為OTP),意思是"一次性密碼本",因?yàn)橐郧斑@樣的key都是印刷成密碼本,每次使用的時(shí)候,必須從其中挑選key。