2012-09-03 14 views
1
int main() 
{ 
SHA256_CTX context; 
unsigned char md[SHA256_DIGEST_LENGTH]; 
char *input = NULL; 
printf("What to hash: "); 
scanf("%m[^\n]%*c", &input); 
size_t length = strlen((const char*)input); 
int i, n=0; 
SHA256_Init(&context); 
SHA256_Update(&context, (unsigned char*)input, length); 
SHA256_Final(md, &context); 
goto NORMAL; 
MORE: 
n++; 
SHA256_Update(&context, md, sizeof(md)); 
SHA256_Final(md, &context); 
NORMAL: 
for(i=0; i<SHA256_DIGEST_LENGTH; i++){ 
    printf("%02x", md[i]); 
} 
printf("\n"); 
if(n==5){free(input);exit(0);} 
goto MORE; 
return 0; 
} 

爲什麼這個麪條代碼不會正確生成多個散列(SHA256)?
我的輸出:
OpenSSL的在C,哈希多次

What to hash: paolo 
254835d73cc88095a30fc74133beabe9d8463b2954493227b205ea326c8a9c86 
f8c9fd41c9aea21015b375af8e30c55df62a74e750f6381c704579b326bff2cd 
dbbae564faab81da846c904659e993542fbb20643f7e2f57cc62934dade3ed87 
a07424dbf030c30b76eb6db0f32a4ed4af084b4d1523cc2cacefbd19a3d0525d 
33041103d21220c8906a3cc0b6369ab38428a440aceb1c5cac963ec471ec1aac 
d529745ec47c77aea87d6a5f63ea509223cbd756d77326f232b0cd1d14681e24 

預期輸出(感謝在線SHA256計算器):

string: paolo 
254835d73cc88095a30fc74133beabe9d8463b2954493227b205ea326c8a9c86 
afbdc26d1e74bf1e9f68f154883e0bf5a1b9878c5c631e78126b07fa21b79ecd 
739efedfc55930ef8cb0d9df487a50ab5b06b7f66594e82e437723df1e6184a1 
008f3e3942bfb4289ad8fbbd081e981c4e32ec6508d43d8c3ae10d1b42e792d0 
5ec489fc8b5345f43d821b8bac6851d61dc5f4f1fb825a5b74cc18e7bbc3e1b3 

回答

3

問題是,您正在重新散列結果散列的(字節)表示形式,而不是其十六進制表示形式。您必須在每次迭代後將其轉換爲十六進制(可能使用sprintf()或類似)。

正如David Schwartz正確指出的那樣,您還必須將Init()的哈希上下文重新清除,並且不會在其中留下其他錯誤數據。

+0

mmm ok ...讓我們試試... :) – polslinux

+0

我已經添加了'for(i = 0; i polslinux

+1

@polslinux當然不是。你的md緩衝區不夠大 - 事實上,它可能會很容易崩潰 – 2012-09-03 14:48:59

3

當您啓動第二次及以後的哈希值,你離開SHA256_CTX滿剩餘的垃圾從先前的循環。您需要再次撥打SHA256_Init才能重設。

+0

嗯,我懷疑。他正在重新調整前一次迭代結果的二進制(而不是文本)表示。 – 2012-09-03 14:33:14

+0

@ H2CO3:你說的沒錯。他也做錯了。 –

+0

顯然你也是對的:P – 2012-09-03 14:33:59