Asish6542165 Ответов: 1

Реализация хэша Sha256 и ripemd160 на языке Си.


Мне нужна некоторая помощь с реализацией хэша sha256 и ripemd160 в программе c. Кто-нибудь знает, как я могу выполнить sha256 на массиве символов? Я написал код

<pre>#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
 
int main (void) {
	const char s[131] = "0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6";
	unsigned char *d = SHA256(s, strlen(s), 0);
 
	int i;
	for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
		printf("%02x", d[i]);
	putchar('\n');
 
	return 0;
}


проблема в том, что этот код дает неправильный вывод, когда длина массива символов s увеличивается.
Если вы замените открытый ключ любой строкой, которая достаточно мала, он будет работать правильно.
Но я не могу понять, как я могу сделать это с большими массивами символов. Любые предложения или код будут полезны.
А также хочу помочь с тем, как сделать хэш ripemd160 на результирующем исходе sh256 на языке Си.
Вы можете скомпилировать приведенный выше код с помощью этой команды
gcc test.c -lssl -lcrypto


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

<pre lang="text"><pre>include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
 
int main (void) {
	const char s[131] = "036EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96";
	unsigned char *d = SHA256(s, strlen(s), 0);
 
	int i;
	for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
		printf("%02x", d[i]);
	putchar('\n');
 
	return 0;
}


итог этой трески таков
d1b9207a2144271601f7fab515d60aeef167c919a1f78560314106576ada35ec

и это правильно.
но доза не работает с несжатой формой открытого ключа биткоина.

1 Ответов

Рейтинг:
11

OriginalGriff

Вы, кажется, немного смущены:

Цитата:
Если вы замените открытый ключ любой строкой, которая достаточно мала, он будет работать правильно.

SHA - это алгоритм хеширования, а не алгоритм шифрования- он не использует ключ, открытый или закрытый.
Алгоритмы хэширования всегда генерируют значение с одинаковым размером - в этом весь смысл - и они делают это, "выбрасывая" информацию, и как таковые не являются "обратимыми": вы не можете гарантировать, что получите исходные входные данные обратно из выходного значения. Алгоритмы шифрования отличаются - они используют ключ, чтобы сделать выходные данные намного, намного сложнее повернуть вспять, чтобы получить исходные входные данные.
Если ваш код хорош для генерации значений SHA, то он должен работать для ввода любого размера. Таким образом, вы предполагаете что-то неправильно или пытаетесь сделать что-то, что на самом деле невозможно.


Asish6542165

можете ли вы предложить мне код для выполнения sha256 на массиве char в c

OriginalGriff

У вас уже есть код для этого:

SHA256(s, strlen(s), 0);

Это часть библиотеки OpenSSL, и именно это она и делает!
https://www.openssl.org/docs/man1.0.2/man3/SHA256.html

Asish6542165

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

OriginalGriff

Откуда мне знать? Я не вижу кода, который вы используете, который использует более длинный массив!
И откуда ты знаешь, что все пойдет не так?
Как вы это проверяете?

Asish6542165

да я это проверил

это тот же самый код, который вы ищете с более длинной строкой 0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

OriginalGriff

Я не спрашивал, проверяли ли вы его, я спрашивал, как вы его проверяли.

Это, вероятно, довольно фундаментально, учитывая, что этот код использовался тысячами - возможно, миллионами - других пользователей без каких-либо проблем.

Asish6542165

когда я компилирую его он дает мне этот вывод

37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406

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

32511e82d56dcea68eb774094e25bab0f8bdd9bc1eca1ceeda38c7a43aceddce

OriginalGriff

Как я могу вам помочь, если вы не отвечаете на вопросы?

Asish6542165

Я скомпилировал код на своей машине Кали. Я использовал ту же строку на этом сайте для генерации sha https://emn178.github.io/online-tools/sha256.html но выходные данные моего кода и этого сайта совершенно разные.

OriginalGriff

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