注意,本文禁止轉載!
今天畫油畫時,心血來潮,將衣帶上的花紋線水平地作 XOR 運算, 一條接一條的畫著,柔柔軟軟,效果不錯。 順便想到在玩電腦的時候,也幾度見到 Xor 的身影。 xor 是 Exclusive OR 的縮寫, 像 MUTEX 的 X 也是 Exclusive (mutual exclusive) 它是雙運算子函數,很多語言都有提供,如: X xor Y --> by VB X ^ Y == (X&Y)^(~X&~Y) --> by C and C++ and C# and Java xor X,Y --> by Assembly ::operator^(X,Y) --> by C++ (0). SSI(Small Scale Integration)中, 常用 XOR+AND或OR gate 做出 universal gate.. (1). 由 True table 可看出它是個奇函數, 所以它可以驗證是否 binary 變數有奇數個1,比如: #define hasOdd_1(n) ((n)^0) (2). 可用來交換變數,像是: #define swap(a,b) (a)^=(b); (b)^=(a); (a)^=(b); 或: #define swap(a,b) (a)^=(b)^=(a)^=(b); (3). 將變數清成0: #define cls(n) (_asm xor (n),(n)) 在密碼學中,XOR 出現的次數可說是多到有濫用的嫌疑,隨便想就有: (4). Vigenere 的 autokey cryptSystem, 有 plaintext 與 key 具相同字元頻率分布的問題, AT&T 的 Gilbert Vernam 在 1918 年說: "令 Ci = Pi^Ki 就行了!" Ci = CryptText 的第 i 個 bit Pi = PlainText 的第 i 個 bit Ki = key 的第 i 個 bit (註: 後來大兵 Joseph Mauborgane 將之改良成著名的 one-time pad 架構, 我私下把它叫做 discard pad: 用完即可丟架構) (5). 將 Block cipher 轉成 Stream cipher: 1945 年,偉大的 Claude Shannon 提出 product cipher (乘積加密法) 的兩大建構方式, 一個是 confusion (混淆,相con-,融合fusion) 一個是 diffusion (擴散,非diff-,融合fusion) diffusion 就是讓一個明文位元可影響到多個密文位元, 最簡單的方式為: bool C[64], P[64], IV; //P[i]=第i個明文位元 cin >> IV; //C[i]=第i個密文位元 while (cin >> C[i]); //IV=Initial Vector C[0] = P[0] ^ IV; for( i=1; i<n; i++) C[i] = C[i-1] ^ P[i]; ECB(Electronic Codebook Mode) 為應付大流量資料 而提出的 CBC(Cipher Block Chaining Mode) 就是此類的應用。 更進一步地, CFB(Cipher FeedBack Mode), 可將 Block cipher 轉成 Stream cipher, 使得每加密完一個字元後,便可將它立即送出, 這要如何辦到!? 就像這般: char C[64], P[64]; //P[i]=第i個明文字元 int IV; cin >> IV; //C[i]=第i個密文字元 while (cin >> C[i]); //IV=Initial Vector C[0] = P[0] ^ ((IV & 0xf000)>>24); send( C[0] ); //將 C[0] 送出 IV <<= 8; IV |= C[0]; for( i=1; i< n; i++) { C[i] = P[i] ^ ((IV & 0xf000)>>24); send( C[i] ); IV <<= 8; IV |= C[i]; } 解密時, 反著作就行了. (6). 對於 DES 等的 Differential Attack (差異破解法): 令DES明文區 binary block = Mi, 1<i<18 Ki = key 的第 i 個 bit 則 Mi+1 = Mi-1 ^ f(Mi,Ki) ,i=1~16, f=加密函數,為已知 再取得另一明文訊息 M', 令 XOR difference (XOR差距) Xi = Mi ^ M'i 則 X(i+1) = M(i-1) ^ M'(i+1) = [M(i-1) ^ f(Mi,Ki)] ^ f(M'i,Ki) 假設 key 不變,輸入M的XOR difference是 X_in, 其輸出的XOR difference是 X_out, 而 X_in 導致 X_out 的機率很高, 也就是 X(i-1) 與 X(i) 出現機率很高的話, 則 X(i+1) 出現機率也會很高, 咱便可比對多組輸入輸出的 XOR difference,求出 key。
沒有留言:
張貼留言