簡體   English   中英

c程序中的SHA256和RIPEMD160HASH

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM