Asish6542165 Ответов: 1

SHA256 и RIPEMD160HASH в программе C


Я написал программу на языке Си для выполнения хэша sha256 в массиве символов, а затем для выполнения хэша ripemd160 на выходе хэш-функции sha256.

вот мой код:
#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, результирующий хэш-вывод функции RIPEMD160 становится неправильным. Может ли кто-нибудь сказать мне, почему это происходит? И как можно исправить мой код для печати и хранения моего хэша ripems160 в массиве символов?

Что я уже пробовал:

Here is what I have tried:

the resulting hash output of the string "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187"

is : 37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406

which is correct.

But the ripemd160 hash of "37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406" should be

"4ecc9d3eea56b0af96b6db612b76911858dcb40d" but my is wrong.

here is the output of my code when compiled with this command

"gcc sha256.c -lssl -lcrypto -Wno-deprecated-declarations"

output:

37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406 63bb23be08e2c097008c4c272cc56c14e5656831

the second string "63bb23be08e2c097008c4c272cc56c14e5656831" is ripemd160 hash which is wrong

Richard MacCutchan

Откуда вы знаете, что это неправильно?

1 Ответов

Рейтинг:
1

phil.o

const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";

Вам уже говорили об этом, но я собираюсь сказать вам еще раз: rawdata переменная не содержит байтовых значений, которые вы думаете, что она содержит. Потому что вы путаете массив байтов (который представляет собой набор байтовых значений) и его строковое представление.
Возможно, вы захотите написать вместо этого:
const unsigned char* rawdata = { 0x04, 0x6E, 0xAF, 0x09, 0x68, 0xAA, 0x89, 0x5A, 0xDD, 0xFE, 0xE5, 0x99, 0x56, 0x6F, 0x0B, 0x88, 0x02, 0x42, 0x46, 0x1D, 0x13, 0x77, 0xF4, 0x88, 0x7C, 0x9B, 0x84, 0x63, 0x1E, 0x13, 0x06, 0x7B, 0x96, 0xDB, 0x18, 0xC4, 0x1E, 0x0C, 0x20, 0x8F, 0x8D, 0x12, 0xEB, 0xCC, 0x3F, 0x99, 0xF2, 0x52, 0x29, 0x03, 0xAF, 0x61, 0x05, 0x83, 0x3E, 0x4C, 0xBA, 0xDE, 0x9D, 0x6A, 0x1D, 0x0F, 0x03, 0x91, 0x87 };

Иначе говоря: Строковое представление массива байтов хранится внутри с набором байтов, которые не совпадают с байтами в самом массиве байтов.

Короткий пример:
Возьмем массив байтов { 0x00, 0x42 }. Он имеет 2 байта.
Это строковое представление - "0042", которое имеет 4 символа и хранится в памяти с 4 байтами ({ 0x30, 0x30, 0x34, 0x32 }, которые являются кодами ASCII символов в шестнадцатеричном представлении), то есть в два раза больше значения, которое оно представляет.


OriginalGriff

У меня такое чувство, что этот человек не хочет ничему учиться - просто ему вручают решения. :вздох:

phil.o

Может быть, вы и правы, но кто знает, может, и Искра полетит.

Asish6542165

но когда я делаю это во время компиляции это дает мне ошибку сегментации

phil.o

Ошибка сегментации возникает при попытке получить доступ к адресу памяти, который вам не принадлежит. Какая линия является причиной этого?
Попробуйте использовать объявление массива вместо указателя:

const unsigned char rawdata[] = { 0x04, 0x6E, ... };