2009年10月30日 星期五

XOR

注意,本文禁止轉載!

今天畫油畫時,心血來潮,將衣帶上的花紋線水平地作 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。

沒有留言:

張貼留言