我编写了一个c程序,对字符数组执行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;
}
问题就出在这一行:
无符号char*d=SHA256(raw-data, strlen(raw-data),0);当我将d指针(sha256函数的输出)传递给RIPEMD160函数时,RIPEMD160函数的哈希输出变为错误。谁能告诉我为什么会这样?以及如何纠正我的代码打印和存储我的riems160哈希在char数组?
以下是我尝试过的:
字符串"046EAF0968AA895ADDFEE599566F0B8802461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187"的哈希输出结果
is:37A0DF85D5CCF7CB5F92B53AA3F223D76C115A844ED52D8978 DEECD2ECB3E406
这是正确的。
但是"37a0df85d5ccf7cb5f92b53aaa3f223d76c115a844ed52d8978deecd2ecb3e406"的riemd160散列应该是
“4ecc9d3eea56b0af96b6db612b76911858dcb40d”但我的错误。
下面是使用此命令编译代码时的输出
“gcc sha256.c-lssl-lcrypto-Wno不推荐的声明”
输出:
37A0DF85D5CCF7CB5F92B53AA3F223D76C115A844ED52D8978 DEECD2ECB3E406 63BB23BE08E2C097008C4C272CC56C14E565656831
第二个字符串“63BB23BE08E2C097008C4C272CC56C14E56568331”是错误的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++)
我试图从这个网站编程SHA256实现:http://bradconte.com/sha256_c在MSP430单片机板上。我正在使用开源的Energia IDE进行编程。 这是测试代码: 这就转换成了魔法 问题是输出总是错误的哈希代码。 这是输出: 我在这里做错的是测试代码还是其他什么?
(再说一遍,数据是字节数组) 但是,字节不匹配。我是不是漏掉了什么? (好吧,我当然是,否则它会起作用的,对吧?:S) -86,44,95,84,3,50,7,-119,-36,46,39,32,-120,7,10,-86,-101,110,-93,-72,-13,-93,-42,111,0,59,-85,-63,-15,-98,-17,-52 当转换为 170,44,95,84,3,50,7,1
本文向大家介绍C ++程序中的restder(),包括了C ++程序中的restder()的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++函数的工作原理,语法和示例。 什么啊 restder()函数是C ++ STL中的内置函数,在<cmath>头文件中定义。用于查找其余参数。 此函数采用两个参数,一个用于分子,第二个用于,并计算其余数,并返回一个四舍五入到最接近的浮点数。
本文向大家介绍C / C ++程序中的mbrtowc()函数,包括了C / C ++程序中的mbrtowc()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中std::mbrtowc()函数的工作,语法和示例。 什么是std::mbrtowc()? std::mbrtowc()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。mbrtowc()
本文向大家介绍C程序中结构和联合的区别,包括了C程序中结构和联合的区别的使用技巧和注意事项,需要的朋友参考一下 在C语言中,我们有用于相同类型数据和多个类型数据的容器。对于存储相同类型的数据,C提供了存储相同类型的数据变量的数组的概念,而对于存储不同类型的数据,C具有结构和联合的概念,也可以存储不同类型的数据变量。 由于Structure和Union都可以在其中保存不同类型的数据,但是现在基于内部
用C编程语言显示表或多或少类似于计数。 我们只使用一次迭代并使用正在打印的表的值递增它。 算法 (Algorithm) 让我们首先看看打印表格的逐步程序应该是什么 - START Step 1 → Define table value n Step 2 → Iterate from i = n to (n*10) Step 3 → Display i Step 4 → In