繁体   English   中英

C中的openssl,多次哈希

[英]openssl in C, hash multiple times

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)?
我的输出:

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

预期输出(感谢在线sha256计算器):

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

当开始第二个和后续的哈希时,您SHA256_CTX保留为先前循环中的剩余垃圾。 您需要再次调用SHA256_Init进行重置。

问题在于您要重新哈希结果哈希的二进制 (字节)表示形式,而不是其十六进制表示形式。 您必须在每次迭代后将其转换为十六进制(可能使用sprintf()或类似方法)。

正如David Schwartz正确指出的那样,您还必须重新Init()哈希上下文以清除它,而不要在其中保留其他错误数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM