最近我有理由比较河豚算法。我在比较
DI Management
mcrypt
. 我无法让他们以任何方式同意。
这使我开始了一场有趣的追逐。根据
this posting
bfinit(char *key,int keybytes)
{
unsigned long data;
...
j=0;
...
data=0;
for(k=0;k<4;k++){
data=(data<<8)|key[j];
j+=1;
if(j==keybytes)
j=0;
}
...
}
键[j]的值是“1”。例如,如果键[j]=0x80,
中的等效代码
blf_Initialise
wData = &H0
For k = 0 To 3
wData = uw_ShiftLeftBy8(wData) Or aKey(j)
j = j + 1
If j >= nKeyBytes Then j = 0
data<<=8;
data|=(unsigned long)key[j]&0xff;
我在VB6中实现了
wData = uw_ShiftLeftBy8(wData)
wData = wData Or ( aKey(j) And &HFF )
事实上,我编写它是为了使用这两种方法,然后放入一个断言来检查值是否相同,即:
wData = uw_ShiftLeftBy8(wData)
wData = wData Or (aKey(j) And &HFF)
wDCheck = uw_ShiftLeftBy8(wData) Or aKey(j)
Debug.Assert wData = wDCheck
我对这种情况的理解正确吗?是发生了符号扩展错误还是我看到了没有的错误?
奇怪的是,DI管理代码附带的测试似乎在有或没有这种变化的情况下都能正常工作(这可能意味着我对这两种算法之间等价性的搜索可能依赖于其他一些东西)