2

我编写了 ac 程序对 char 数组执行 sha256 哈希,然后对 sha256 哈希函数的输出执行成熟的 160 哈希。

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
#include <openssl/ripemd.h>

int main(){
int c;

const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";
unsigned long n = strlen(rawdata);
unsigned char *d = SHA256(rawdata, strlen(rawdata), 0);

for (c = 0; c < 32; c++){
    printf("%02x", d[c]);
}
putchar('\n');

unsigned char md[32];
unsigned char* pmd = RIPEMD160(d, strlen(d), md);

int i;
for (i = 0; i < 20; i++)
    printf("%02x", pmd[i]);
putchar('\n');

return 0;

}

问题出在这一行:

无符号字符 *d = SHA256(原始数据,strlen(原始数据),0);当我将作为 sha256 函数输出的 d 指针传递给 RIPEMD160 函数时,RIPEMD160 函数的结果哈希输出变得错误。谁能告诉我为什么会这样?以及如何更正我的代码以在 char 数组中打印和存储我的ripems160 哈希?

这是我尝试过的:

字符串“046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187”的哈希输出

是:37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406

哪个是对的。

但是“37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406”的成熟度160哈希应该是

“4ecc9d3eea56b0af96b6db612b76911858dcb40d”但我错了。

这是使用此命令编译时我的代码的输出

“gcc sha256.c -lssl -lcrypto -Wno-deprecated-declarations”

输出:

37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406 63bb23be08e2c097008c4c272cc56c14e5656831

第二个字符串“63bb23be08e2c097008c4c272cc56c14e5656831”是ripemd160哈希,这是错误的

4

1 回答 1

0

您的问题出在这一行:

unsigned char* pmd = RIPEMD160(d, strlen(d), md);

strlen通过查找终止符来查找可打印字符串的长度\0。但是里面的数据d是二进制数据。它不是由该值终止的,\0并且可能包含该值作为数据的一部分。您应该替换strlen(d)为 SHA256 哈希 (32) 长度的实际值。

更新:

看来您的“正确”输出可以通过对 SHA256 输出进行进一步处理来实现。我不知道你从哪里得到你的测试向量,但似乎 RIPEMD160 函数的预期输入是转换为可打印字符串的 SHA256 输出 - 并散列字符串。

这些修改似乎实现了您期望的输出:

--- doublehash1.c   2020-03-21 00:50:11.882423750 +0000
+++ doublehash.c    2020-03-21 00:49:36.778485523 +0000
@@ -9,14 +9,16 @@
     const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";
     unsigned long n = strlen(rawdata);
     unsigned char *d = SHA256(rawdata, strlen(rawdata), 0);
+    unsigned char data[65], *p;

-    for (c = 0; c < 32; c++){
-        printf("%02x", d[c]);
+    for (c = 0, p = data; c < 32; c++, p += 2){
+        sprintf(p, "%02x", d[c]);
     }
+    printf("%s", data);
     putchar('\n');

     unsigned char md[32];
-    unsigned char* pmd = RIPEMD160(d, strlen(d), md);
+    unsigned char* pmd = RIPEMD160(data, strlen(data), md);

     int i;
     for (i = 0; i < 20; i++)
于 2020-03-20T21:27:32.197 回答