Я пытаюсь выполнить хэш SHA256 в дайджесте сообщения хэша RIPEMD 160. Я использую библиотеку OpenSSL на платформе Mac.
Проблема, с которой я столкнулся, — это промежуточный процесс получения дайджеста сообщений RIPEMD 160 и последующего выполнения другого хэша SHA256. До сих пор я был в состоянии выполнить только 1) хэш SHA256 для строки, 2) хэш RIPEMD160 для строки в отдельности. Мне нужно выполнить хэш RIPEMD160 для предыдущего дайджеста сообщения SHA256, а затем выполнить второй хэш SHA256 для дайджеста RIPEMD 160 ……
Дайджест SHA256 -> хэш-функция RIPEMD160 -> Дайджест RIPEMD160 -> 2-я хэш-функция 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();
}
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;
}
Код для хэш-функции 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);
Других решений пока нет …