我正在尝试了解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功能,而不是深入的概述。
如果您需要更多信息,我就在这里。 谢谢!
答案 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位输出。