Программа SHA256 и RIPEMD160HA SH в c - PullRequest
1 голос
/ 20 марта 2020

Я написал c программу, которая выполняет sha256 га sh на массиве символов и затем выполняет palemd160 га sh на выходе функции sha256 га sh.

вот мой код :

#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;

}

проблема в этой строке:

unsigned char * d = SHA256 (raw-data, strlen (raw-data) , 0); когда я передаю указатель d, который является выходом функции sha256, в функцию RIPEMD160, результирующий вывод ha sh функции RIPEMD160 становится неправильным. Может кто-нибудь сказать мне, почему это происходит? И как можно исправить мой код, чтобы распечатать и сохранить мои palems160 га sh в массиве символов?

Вот что я пробовал:

результирующий вывод ha sh строки "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187"

1017 * есть:. 37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406 1019 *, который является правильным 1021 * Но ripemd160 га sh из "37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406" должно быть

«4ecc9d3eea56b0af96b6db612b76911858dcb40d», но my is not.

здесь выводится мой код при компиляции с этой командой

"g cc sha256. c -lssl -lcrypto -Wno-deprecated -declarations "

1029 * выход: 1031 * 37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406 63bb23be08e2c097008c4c272cc56c14e5656831 1033 * вторая строка "63bb23be08e2c097008c4c272cc56c14e5656831" является ripemd1 60 га sh что не так

1 Ответ

0 голосов
/ 21 марта 2020

Ваша проблема в этой строке:

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++)
...