Asish6542165 Ответов: 2

Хэш Ripemd160 в программе C.


Я написал программу на языке Си для вычисления хэша ripemd160 на 64-байтовом массиве символов.Но это дает мне неправильный вывод. Это мой код.:

<pre>#include <stdio.h>
#include <string.h>
 #include <openssl/ripemd.h>
int main (void) {
	 unsigned char s[7] = "37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406";
	unsigned long n=20;
	unsigned char *d;


	 unsigned char *RIPEMD160(const unsigned char *s, unsigned long n,
                  unsigned char *d);
 
	int i;
	for (i = 0; i < 20; i++)
		printf("%02x", d[i]);
	putchar('\n');
 
	return 0;
}



может ли кто-нибудь сказать мне, где я ошибаюсь?

выход на этот код:
31ed4989d15e4889e24883e4f050544c8d059a01


но правильный выход должен быть:
4ecc9d3eea56b0af96b6db612b76911858dcb40d


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

#include <stdio.h>
#include <string.h>
 #include <openssl/ripemd.h>
int main (void) {
	 unsigned char s[7] = "37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406";
	unsigned long n=20;
	unsigned char *d;


	 unsigned char *RIPEMD160(const unsigned char *s, unsigned long n,
                  unsigned char *d);
 
	int i;
	for (i = 0; i < 20; i++)
		printf("%02x", d[i]);
	putchar('\n');
 
	return 0;
}

Richard MacCutchan

Вы объявляете функцию RIPEMD160, но никогда не вызываете ее для выполнения преобразования.

Asish6542165

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

Richard MacCutchan

Точно так же, как вы вызываете любую функцию. Просмотрите документацию, установите правильные параметры и запишите все данные ответа. Вы также объявили массив s только как 7 символов, так что код даже не должен компилироваться. Я не могу понять, откуда вы получаете значения результатов.

Asish6542165

можете ли вы дать мне какой-нибудь код c для выполнения хэша ripemd160 на массиве символов на языке c? Это было бы очень полезно. пожалуйста

Richard MacCutchan

Все это объясняется здесь: ripemd(3): хэш-функция RIPEMD - 160- Man-страница Linux[^].

Asish6542165

это то же самое, что и OpenSSL "https://www.openssl.org/docs/man1.0.2/man3/RIPEMD160.html-документация, которую я должен просмотреть. Можете ли вы дать мне код, написанный в поле для комментариев

Richard MacCutchan

Вы хотите сказать, что не знаете, как написать простой вызов функции на языке Си?

Asish6542165

нет. Это немного сбивает с толку. Было бы полезно, если бы вы могли предоставить код.

2 Ответов

Рейтинг:
6

Richard MacCutchan

const unsigned char* rawdata = "<add your string data here>";
unsigned long n = strlen(rawdata);
unsigned char md[32];
unsigned char* pmd = RIPEMD160(rawdata, n, md);


Asish6542165

Я пробовал то же самое, но не знаю, почему он продолжает давать мне эту ошибку:

test.c: в функции ‘main’:
test.c:10:1: предупреждение: ‘RIPEMD160’ устарел [-Wdeprecated-объявления]
10 | unsigned char* pmd = RIPEMD160(rawdata, n, md);
| ^~~~~~~~
В файле included from /usr/local/include/openssl/opensslv.h:109,
from /usr/local/include/openssl/macros.h:11,
from /usr/local/include/openssl/opensslconf.h:14,
from /usr/local/include/openssl/macros.h:10,
from /usr/local/include/openssl/ripemd.h:14,
из теста.c:3:
/usr/местные/включать/поддержка/хэш-функция ripemd.ч:49:1: Примечание: объявлены здесь
49 | DEPRECATEDIN_3_0(неподписанные символ *RIPEMD160(константный беззнаковый тип char *д, реализация Н,

Richard MacCutchan

Компилятор говорит вам, что эта функция устарела и не должна использоваться. Используйте более новый хэш, например SHA256, который полностью поддерживается.

Asish6542165

есть ли какой-нибудь способ использовать хэш ripemd160 в программе c?

Richard MacCutchan

Это не ошибка, это предупреждение, программа все равно должна компилироваться. Однако вы можете подавить его, добавив объявления option-Wno-deprecated-в параметры компилятора, как показано в сообщении.

Asish6542165

большое спасибо за вашу помощь

Рейтинг:
12

CPallini

Цитата:
31ed4989d15e4889e24883e4f050544c8d059a01
Если это шестнадцатеричное строковое представление массива байтов, то вы должны сделать что-то вроде:
unsigned char s[] = { 0x31, 0xed, 0x49, 0x89, ..., 0x01};
unsigned char h[20];
RIPEMD160(s, sizeof(s), h);

(вы должны заменить ... с реальными цифрами, конечно).


Asish6542165

это дает ошибку.

test.c: в функции ‘main’:
test.c:9:1: предупреждение: ‘RIPEMD160’ устарел [-Wdeprecated-объявления]
9 | RIPEMD160(s, sizeof(s), h);
| ^~~~~~~~~
В файле included from /usr/local/include/openssl/opensslv.h:109,
from /usr/local/include/openssl/macros.h:11,
from /usr/local/include/openssl/opensslconf.h:14,
from /usr/local/include/openssl/macros.h:10,
from /usr/local/include/openssl/ripemd.h:14,
из теста.c:3:
/usr/местные/включать/поддержка/хэш-функция ripemd.ч:49:1: Примечание: объявлены здесь
49 | DEPRECATEDIN_3_0(неподписанные символ *RIPEMD160(константный беззнаковый тип char *д, реализация Н,
| ^~~~~~~~~~~~~~~~

а строка "31ed4989d15e4889e24883e4f050544c8d059a01" на самом деле является sha256 другого входа. Я пытаюсь написать код на языке Си для генерации биткойн-адресов. Я не могу передать его в этом беззнаковом символе s[] = { 0x31, 0xed, 0x49, 0x89, ..., 0x01}; путь.эта строка фактически хранится в переменной-указателе.

Asish6542165

можете ли вы дать мне какой-нибудь код c для выполнения хэша ripemd160 на массиве символов на языке c? Это было бы очень полезно. пожалуйста