Выполнение хэша SHA256 в дайджесте сообщений RIPEMD160

Я пытаюсь выполнить хэш SHA256 в дайджесте сообщения хэша RIPEMD 160. Я использую библиотеку OpenSSL на платформе Mac. Проблема, с которой я столкнулся, - это промежуточный процесс получения дайджеста сообщений RIPEMD 160 и последующего выполнения другого хэша SHA256. До сих пор я был в состоянии выполнить только 1) хэш SHA256 для строки, 2) хэш RIPEMD160 для строки в отдельности. Мне нужно выполнить хэш RIPEMD160 для предыдущего дайджеста сообщения SHA256, а затем выполнить второй хэш SHA256 для дайджеста RIPEMD 160......

Дайджест SHA256 -> хэш-функция RIPEMD160 -> Дайджест RIPEMD160 -> 2-я хэш-функция SHA256. Я надеюсь это имеет смысл....?

Код для хэш-функции SHA256 только для строки

string sha256(const string str)
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
stringstream ss;

for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{

    ss << hex << setw(2) << setfill('0') << (int)hash[i];
}
return ss.str();

}

Код для хэша RIPEMD160 только на строку

 int main()
 {

  unsigned char digest[RIPEMD160_DIGEST_LENGTH];

  char string[] = "hello world";

  RIPEMD160((unsigned char*)&string, strlen(string), (unsigned 
  char*)&digest);

  char mdString[RIPEMD160_DIGEST_LENGTH*2+1];

     for(int i = 0; i < RIPEMD160_DIGEST_LENGTH; i++)
     sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);

     printf("RIPEMD160 digest: %s\n", mdString);

  return 0;

}

1 ответ

Код для хэш-функции SHA256 только для строки

SHA256 не работает на струнах. SHA256 работает на байтах. К сожалению, в C они часто имеют одинаковый тип данных.

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


Если предположить, что ваши входные данные являются текстовой строкой, и в настоящее время они представлены в ожидаемой кодировке (US-ASCII / ISO-8859-1 / UTF-8), то после исправления некоторых некорректных указателей ваш код в порядке:

unsigned char digest[RIPEMD160_DIGEST_LENGTH];
...
RIPEMD160((unsigned char*)string, strlen(string), (unsigned char*)digest);

Сейчас digest содержит ваш дайджест RIPEMD160. Напомним, что криптография работает только с байтами, а дайджест - байтами, и мы получаем

unsigned char hash[SHA256_DIGEST_LENGTH];

SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, digest, RIPEMD160_DIGEST_LENGTH);
SHA256_Final(hash, &sha256);

Или версия ускорителя, как вы сделали с RIPEMD160:

unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256(digest, RIPEMD160_DIGEST_LENGTH, hash);
Другие вопросы по тегам