[英]SHA256 and RIPEMD160HASH in c program
我編寫了 ac 程序來對 char 數組執行 sha256 哈希,然后對 sha256 哈希函數的輸出執行ripemd160 哈希。
這是我的代碼:
#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;
}
問題出在這一行:
無符號字符 *d = SHA256(原始數據,strlen(原始數據),0); 當我將作為 sha256 函數輸出的 d 指針傳遞給 RIPEMD160 函數時,RIPEMD160 函數的結果哈希輸出會出錯。 誰能告訴我為什么會這樣? 以及如何更正我的代碼以在字符數組中打印和存儲我的ripemms160 哈希?
這是我嘗試過的:
字符串“046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F253620D70C30F90F2536E70C08F90F2536E90F90F2536E7F90F2536E70F90F2536E7F90F2536E90F70F90F356E90F70F90F356E10F”的哈希輸出結果
是: 37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406
哪個是正確的。
但是“37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406”的ripemd160哈希應該是
“4ecc9d3eea56b0af96b6db612b76911858dcb40d”但我錯了。
這是使用此命令編譯時我的代碼的輸出
“gcc sha256.c -lssl -lcrypto -Wno-deprecated-declarations”
輸出:
37a0df85d5ccf7cb5f92b53aa3f223d76c115a844ed52d8978deecd2ecb3e406 63bb23be08e2c097008c4c272cc56c14e5656831
第二個字符串“63bb23be08e2c097008c4c272cc56c14e5656831”是ripemd160哈希,這是錯誤的
你的問題在這一行:
unsigned char* pmd = RIPEMD160(d, strlen(d), md);
strlen
通過查找終止\\0
來查找可打印字符串的長度。 但是d
的數據是二進制數據。 它不以\\0
終止,並且可能包含該值作為數據的一部分。 您應該將strlen(d)
替換為 SHA256 散列長度 (32) 的實際值。
更新:
似乎可以通過對 SHA256 輸出進行一些進一步處理來實現您的“正確”輸出。 我不知道你從哪里得到你的測試向量,但似乎 RIPEMD160 函數的預期輸入是轉換成可打印字符串的 SHA256 輸出 - 並對該字符串進行哈希處理。
這些修改似乎達到了您期望的輸出:
--- doublehash1.c 2020-03-21 00:50:11.882423750 +0000
+++ doublehash.c 2020-03-21 00:49:36.778485523 +0000
@@ -9,14 +9,16 @@
const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";
unsigned long n = strlen(rawdata);
unsigned char *d = SHA256(rawdata, strlen(rawdata), 0);
+ unsigned char data[65], *p;
- for (c = 0; c < 32; c++){
- printf("%02x", d[c]);
+ for (c = 0, p = data; c < 32; c++, p += 2){
+ sprintf(p, "%02x", d[c]);
}
+ printf("%s", data);
putchar('\n');
unsigned char md[32];
- unsigned char* pmd = RIPEMD160(d, strlen(d), md);
+ unsigned char* pmd = RIPEMD160(data, strlen(data), md);
int i;
for (i = 0; i < 20; i++)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.