我开始使用crypto ++ lib,也许我有一些误解。
我没有意识到为什么以下代码会产生错误的sha 256
# include <string>
# include <iostream>
# include "cryptopp/cryptlib.h"
# include <cryptopp/sha.h>
# include <cryptopp/hex.h>
using namespace std;
string sha256_hex(const string & str)
{
byte digest[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size());
string ret;
CryptoPP::HexEncoder encoder;
encoder.Attach(new CryptoPP::StringSink(ret));
encoder.Put(digest, sizeof(digest));
encoder.MessageEnd();
return ret;
}
int main(int argc, char *argv[])
{
auto sha256 = sha256_hex(argv[1]);
cout << "str = " << argv[1] << endl
<< "sha 256 = " << sha256_hex(sha256) << endl;
return 0;
}
以下命令
./test-sha256 hello
产生以下输出
str = hello
sha 256 = DD9F20FF4F1DD817C567DE6C16915DC0A731A4DF51088F55CEF4CD2F89CF9620
但是根据此在线计算器enter link description here,"hello"
的正确sha 256将为2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
。
所以我的问题是我做错了什么?
我还有一个问题:应该如何以及何时释放StringSink
对象使用的内存?
提前致谢
答案 0 :(得分:5)
Aren你在这里计算哈希的哈希值吗?您拨打sha256_hex
两次,一次以argv[1]
为参数,一次以sha256
为参数。
答案 1 :(得分:1)
最有可能的是,我发现问题出在这里:
CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size());
你最好通过str.c_str()
。使用调试器查看确切传递的内容 - 它是否转换为hello
?