这个 sha 256 函数有什么问题?
What is wrong with this sha 256 function?
我开始使用 crypto++ 库,也许我有一些误解。
我不明白为什么下面的代码会产生错误的 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
对象使用的内存?
提前致谢
很可能,我发现问题出在这里:
CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size());
你最好通过str.c_str()
。使用调试器查看传递的到底是什么 - 它是否转换为 hello
?
你这里不是计算hash的hash吗?您调用 sha256_hex
两次,一次以 argv[1]
作为参数,一次以 sha256
本身作为参数。
关于问题的第二部分:
在 Crypto++ Pipelining system 中,过滤器和接收器由它们所附加的对象拥有。它们会被该对象的析构函数自动删除。
从 "Important Usage Notes" 到 ReadMe.txt:
If a constructor for A takes a pointer to an object B (except primitive types such as int and char), then A owns B and will delete B at A's destruction. If a constructor for A takes a reference to an object B, then the caller retains ownership of B and should not destroy it until A no longer needs it.
我开始使用 crypto++ 库,也许我有一些误解。
我不明白为什么下面的代码会产生错误的 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
对象使用的内存?
提前致谢
很可能,我发现问题出在这里:
CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size());
你最好通过str.c_str()
。使用调试器查看传递的到底是什么 - 它是否转换为 hello
?
你这里不是计算hash的hash吗?您调用 sha256_hex
两次,一次以 argv[1]
作为参数,一次以 sha256
本身作为参数。
关于问题的第二部分:
在 Crypto++ Pipelining system 中,过滤器和接收器由它们所附加的对象拥有。它们会被该对象的析构函数自动删除。
从 "Important Usage Notes" 到 ReadMe.txt:
If a constructor for A takes a pointer to an object B (except primitive types such as int and char), then A owns B and will delete B at A's destruction. If a constructor for A takes a reference to an object B, then the caller retains ownership of B and should not destroy it until A no longer needs it.