这个 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.