我在浏览蛇实施TrueCrypt加密(7.1A)和一些看起来不正确的!这里是这个算法的接口:TrueCrypt的错误在蛇实施
void serpent_set_key(const unsigned __int8 userKey[], int keylen, unsigned __int8 *ks);
void serpent_encrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks);
void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks);
这里感兴趣的功能是serpent_set_key
。用户密钥是在长度为32个字节,则keylen
应该是它的大小和ks
是用于加密/解密的输出密钥。问题在于实施。这是一开始的有关片段:
unsigned __int32 a,b,c,d,e;
unsigned __int32 *k = (unsigned __int32 *)ks;
unsigned __int32 t;
int i;
for (i = 0; i < keylen/(int)sizeof(__int32); i++)
k[i] = LE32(((unsigned __int32*)userKey)[i]);
for循环,实际上是从用户按键来执行关键复制数据。它是通过将数据视为4字节整数来完成的。现在,如果关键LEN发送作为字节(32是正确的),但...
在TrueCrypt的全部实现这就是所谓的在两个地方一切正常。这是第一个: 在CipherInit被称为像这样:
case SERPENT:
serpent_set_key (key, CipherGetKeySize(SERPENT) * 8, ks);
break;
CipherGetKeySize(SERPENT)
将返回32(字节),所以在参数传递将有256的价值!这是正确的,因为关键的长度,但不是这个实现!这将导致'serpent_set_key'中的缓冲区溢出,因为for循环将运行64次,而不仅仅是8次! 这是所谓的其他地方是在这样的EAInit:
serpent_set_key(key,32 * 8,ks);
这是很明显的是,在参数传递将是256
我很好奇别人怎么想这件事?任何人都可以证实这个错误吗?
TL; DR - http://www.truecrypt.org/bugs/ – CBroe