2015-01-02 52 views
1

我想了解BlowFish加密算法。我有一些問題,這些問題在全部細節如下:Blowfish加密函數(BF_encrypt)C

下面是功能:

void BF_encrypt (data, encrypt) 
     BF_LONG *data; //data is array of two members i.e ti[0] and ti[1] 
         //and BF_LONG is defined as unsigned long in header file 
     int encrypt;  //encrypt is defined as 1 
    { 
    register BF_LONG l, r, *p, *s; //BF_LONG is defined as unsigned long in header file 
    p = key_P;      //key_P is declared as BF_LONG key_P[16 + 2]; 
    s = &(key_S[0]);    //key_S is declared as BF_LONG key_S[4 * 256]; 
    l = data[0];     //data[0]=ti[0] 
    r = data[1];     //data[1]=ti[1] 
    l ^= p[0];      //Bitwise ex-or of l with p[0]; 
    BF_ENC (r, l, s, p[1]); 
    } 

這裏是BF_ENC功能:

#define BF_ENC(LL,R,S,P) \ 
    LL^=P; \ 
    LL^=(((S[  (R>>24L)  ] + \ 
     S[0x0100+((R>>16L)&0xff)])^ \ 
     S[0x0200+((R>> 8L)&0xff)])+ \ 
     S[0x0300+((R )&0xff)])&0xffffffff; 

這裏是我的問題:

「\」在BF_ENC的每個結束行中是什麼意思?

R >> 24L,我可以知道它正在向右移動。 L在這裏很長,但我在這裏沒有得到它的存在。 L對數據有什麼影響?

最後一個問題是,什麼是BF_ENC函數做了所有,只是一個概述不深入。

如果您需要更多信息,我在這裏。 謝謝!

+0

請注意在密碼術中使用正確的術語。 Blowfish是*塊密碼*而不是加密算法*。您可以在[操作模式](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)(如CBC)中使用blowfish來創建加密算法。 –

回答

1

BF_ENC是一個C風格的宏。通常這些由行尾字符分隔。 \轉義符只是表示下一行應被視爲該行的一部分。所以一切都達到0xffffffff;是宏的一部分。


L的效果是,在許多語言的原語類型的輸出可取決於兩個操作數。 L使得long類型的24(和16和8)文字。這將確保輸出是正確的原始類型(至少32位)。特別是它確保輸出足夠大以存儲32位信息。

對於移位,這沒什麼意義(你不會指望移位超過64位,所以輸出可能只是放在左操作數中的原始類型),但語言設計師喜歡對稱性 - 包括操作符如+* - 並且不喜歡特殊情況。

看着前面的問題,我發現:

是的,這是我的想法也是如此。 AFAIR,這真的以K工作& R(1 << 1Llong類型的像1 + 1L是ISO C),這就是爲什麼我問哪裏的代碼是從...

所以一定要確認這個宏在您的環境中正常工作。爲了理解河豚,你可以更好地查看一些根本不包含宏的更現代的代碼。


BF_ENC顯示Blowfishes F函數這是圓函數河豚的(的Feistel函數)。

它是在右上of the Wikipedia page about Blowfish和被描述爲:

該圖右上方示出的Blowfish的F函數。該功能將32位輸入分成四個八位四分之一的區域,並使用四分區作爲S盒的輸入。輸出以模2^32加上XOR來產生最終的32位輸出。

+0

謝謝!我已經得到了你所說的一切。 現在,我只需要再澄清一下,這是什麼意思? S [(R >> 24L)] 我不知道換班多久了?例如,如果我有r = 20那麼它將會移動多少。 P.S:我對這個東西很陌生,所以沒什麼指導。謝謝! –

+0

這個想法是,R值是32位,然後右移24位,這意味着你留下了第一個(最左邊的)8位。如果R是20,那麼它當然會評估爲零。 –