C++OpenSSL Ripemd-160给出错误的输出
C++ OpenSSL Ripemd-160 gives wrong output
我正在尝试构建一个小型应用程序来生成比特币地址(为了理解)
我使用OpenSSL库
我设法将私钥转换为公钥,用sha256散列公钥,结果很好。但是,当我试图通过ripemd160运行sha256结果时,问题出现了。
-我用纯字符串测试了ripemd160函数,它运行良好
-我确实将sha256结果转换为字符串
-我仍然得到错误的结果
这是我的主要内容:
int _tmain(int argc, _TCHAR* argv[])
{
char sha256_buffer[65];
char ripemd160_buffer[41];
char *pvt_key = "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725";
unsigned char *pub_hex = priv2pub((const unsigned char *)pvt_key, POINT_CONVERSION_UNCOMPRESSED );
//printf("%sn", pub_hex);
std::string pub_key_string = hex_to_string(reinterpret_cast<char*>(pub_hex));
sha256(&pub_key_string[0], sha256_buffer);
printf("%sn", sha256_buffer);
std::string hash256_string = hex_to_string(reinterpret_cast<char*>(sha256_buffer));
ripemd160(&hash256_string[0], ripemd160_buffer);
printf("%sn", ripemd160_buffer);
return 0;
}
这是我的ripemd160函数:
void ripemd160(char *string, char outputBuffer[41])
{
unsigned char hash[RIPEMD160_DIGEST_LENGTH];
RIPEMD160_CTX ripemd160;
RIPEMD160_Init(&ripemd160);
RIPEMD160_Update(&ripemd160, string, strlen(string));
RIPEMD160_Final(hash, &ripemd160);
for (int i = 0; i < RIPEMD160_DIGEST_LENGTH; i++)
{
sprintf_s(outputBuffer + (i * 2), sizeof(outputBuffer + (i * 2)), "%02x", hash[i]);
}
outputBuffer[40] = 0;
}
这是我的十六进制到字符串函数:
string hex_to_string(const string& in)
{
string output;
if ((in.length() % 2) != 0) {
throw runtime_error("String is not valid length ...");
}
size_t cnt = in.length() / 2;
for (size_t i = 0; cnt > i; ++i) {
uint32_t s = 0;
stringstream ss;
ss << hex << in.substr(i * 2, 2);
ss >> s;
output.push_back(static_cast<unsigned char>(s));
}
return output;
}
我使用
中的示例https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses
这是我想得到的Ripemd-160:010966776006953D5567439E5E39F86A0D273BEE
这是我实际得到的Ripemd-160:6c9814cf2a93131c8d3263158896e786de7a3f21
应该将SHA-256
哈希的原始字节传递给RIPEMD-160
函数,而不是首先将SHA-256
哈希转换为十六进制字符串。
您可以使用openssl
命令行工具对此进行验证。
原始字节的RIPEMD-160
,与预期值匹配:
$ echo -n '600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408' |
> xxd -p -r | openssl rmd160
(stdin)= 010966776006953d5567439e5e39f86a0d273bee
十六进制字符串的RIPEMD-160
,与预期值不匹配:
$ echo -n '600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408' |
> openssl rmd160
(stdin)= 1435727e0369ab470035797c66215799f258188b
同样,您也应该将公钥的原始字节传递给SHA-256
函数,而不是首先将公钥转换为十六进制字符串。
公钥原始字节的SHA-256
,与预期值匹配:
$ echo -n '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6' |
> xxd -p -r | openssl sha256
(stdin)= 600ffe422b4e00731a59557a5cca46cc183944191006324a447bdb2d98d4b408
公钥的SHA-256
为十六进制字符串,与预期值不匹配:
$ echo -n '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6' |
> openssl sha256
(stdin)= 32511e82d56dcea68eb774094e25bab0f8bdd9bc1eca1ceeda38c7a43aceddce
相关文章:
- 输出错误,问题是找到总和5000位数字cpp
- 使用复制构造函数的程序输出错误
- 异或字符串加密/解密输出错误
- 在linux上使用g++输出错误,在windows上更正
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- ECDSA 密钥对生成输出错误
- fscanf() 输出错误的值
- 输入 1024 后十进制到二进制转换的输出错误?
- 输出错误命令的条件语句
- cuSparse (cusparseDcsrgemm) 中的矩阵乘法输出错误的结果
- 为什么 du -sh 输出错误大小的内存映射文件
- VS2017 的输出错误,但 mingw 有效
- 如何使FFMPEG C 代码不输出错误消息
- 乘以时输出错误.这是我编译器中的错误吗?C
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 为什么输出错误崩溃
- C++输入/输出错误
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- 当我使用此合并排序代码运行时,输出错误
- 递归功能输出错误的值