C中的Blowfish加密函数(BF_encrypt)

时间:2015-01-02 12:13:21

标签: c encryption blowfish

我正在尝试了解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功能,而不是深入的概述。

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

1 个答案:

答案 0 :(得分:1)

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


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

对于移位这没有多大意义(你不会期望超过64位的移位,所以输出可能只是放在左操作数中的基本类型)但是语言设计者喜欢对称 - 用这样的运算符如+* - 并且不喜欢特殊情况。

查看我之前发现的问题:

  是的,这也是我的想法。 Afair,这在K&amp; R中真的有用(1 << 1L的类型long类似1 + 1L在ISO C中),这就是为什么我问代码来自哪里......

因此请确保验证此宏在您的环境中是否正常运行。要了解河豚,你可能最好不要看更多不含宏的现代代码。


BF_ENC显示Blowfishes F函数,它是Blowfish的圆函数(Feistel函数)。

位于右上方of the Wikipedia page about Blowfish,描述为:

  

右上角的图显示了Blowfish的F函数。该功能将32位输入分成四个八位四分之一,并使用四分之一作为S盒的输入。输出以模2 ^ 32和XORed相加,以产生最终的32位输出。