C语言的Blowfish加密函数(BF_encrypt)

Blowfish encryption function(BF_encrypt) in C

我正在尝试了解 BlowFish 加密算法。我遇到了下面详细描述的一些问题:

函数如下:

 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 函数在做什么,只是一个概述,并不深入。

如果您需要更多信息,我就在这里。 谢谢!

BF_ENC 是一个 C 风格的宏。通常那些由行尾字符分隔。 \ 转义字符就在那里表示下一行应被视为该行的一部分。所以 0xffffffff; 之前的所有内容都是宏的一部分。


L 的效果是,在许多语言中,输出的原始类型可能取决于两个操作数。 L 生成 long 类型的 24(以及 16 和 8) 文字。这将确保输出是正确的原始类型(至少 32 位)。特别是它确保输出足够大以存储 32 位信息。

对于移位,这没有多大意义(您不会期望移位超过 64 位,因此输出可能只是放在左操作数中的原始类型)但是语言设计者喜欢对称性 - 与+* 等运算符 - 不喜欢特殊情况。

查看之前的问题我发现:

yes, this was my thought as well. Afair, this really worked in K&R (1 << 1L was of type long like 1 + 1L is in ISO C), which is why I asked where the code is from...

因此请确保您验证此宏在您的环境中是否正常工作。要了解河豚,您最好查看更现代的代码,这些代码根本不包含宏。


BF_ENC显示Blowfishes F函数,即Blowfish的轮函数(Feistel函数)

它在右上角 of the Wikipedia page about Blowfish 并且被描述为:

The diagram to the upper right shows Blowfish's F-function. The function splits the 32-bit input into four eight-bit quarters, and uses the quarters as input to the S-boxes. The outputs are added modulo 2^32 and XORed to produce the final 32-bit output.