Ваша проблема в этой строке:
unsigned char* pmd = RIPEMD160(d, strlen(d), md);
strlen
находит длину строки для печати, ища завершающую \0
. Но данные в d
являются двоичными данными. Он не заканчивается \0
и может содержать это значение как часть данных. Вам следует заменить strlen(d)
фактическим значением длины SHA256 га sh (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++)