我在瀏覽蛇實施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