Dou*_*oug 19 c++ hash stdstring sha256 crypto++
我需要一个如何使用Crypto ++从std :: string生成SHA256哈希并输出std :: string的示例.我似乎无法弄明白.我尝试的一切都给了我无效的输出.
这是interjay回答后的新代码:
string SHA256(string data)
{
byte const* pbData = (byte*) data.data();
unsigned int nDataLen = data.size();
byte abDigest[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
return string((char*)abDigest);
}
Run Code Online (Sandbox Code Playgroud)
SHA256的输出("A"); 是

如何将其转换为可读格式?
感谢interjay的回答,我能够生成最终的哈希值.
Roo*_*oke 17
这将使用以下内容输出base64字符串CryptoPP::Base64Encoder:
#include "sha.h"
#include "filters.h"
#include "base64.h"
std::string SHA256HashString(std::string aString){
std::string digest;
CryptoPP::SHA256 hash;
CryptoPP::StringSource foo(aString, true,
new CryptoPP::HashFilter(hash,
new CryptoPP::Base64Encoder (
new CryptoPP::StringSink(digest))));
return digest;
}
Run Code Online (Sandbox Code Playgroud)
int*_*jay 16
这一行会给出错误的结果:
unsigned int nDataLen = sizeof(pbData);
Run Code Online (Sandbox Code Playgroud)
它总是会给你一个指针的大小.你想要的是data.size().
此外,您不需要此部分:
if(!CryptoPP::SHA256().VerifyDigest(abDigest, pbData, nDataLen))
{
return SHA256(data);
}
Run Code Online (Sandbox Code Playgroud)
它应始终正确验证,因为您只是根据相同的数据计算摘要.如果没有,你将进入无限递归.
要获得可读输出,可以将其转换为十六进制.这是来自Crypto ++ Wiki的 MD5示例,如果用SHA256替换MD5,它应该适合您:
CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "abcdefghijklmnopqrstuvwxyz";
hash.CalculateDigest( digest, (byte*) message.c_str(), message.length() );
CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();
std::cout << output << std::endl;
Run Code Online (Sandbox Code Playgroud)
您的代码将期望从您提供给字符串构造函数的缓冲区中得到一个以 null 结尾的字符串!这意味着结果几乎肯定是错误的。
要强制执行摘要大小,请改用以下命令:
return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);
另外,关于打印它,以下正确地生成了BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD字符串的测试向量"abc"
std::string string_to_hex(const std::string& input)
{
static const char* const lut = "0123456789ABCDEF";
size_t len = input.length();
std::string output;
output.reserve(2 * len);
for (size_t i = 0; i < len; ++i)
{
const unsigned char c = input[i];
output.push_back(lut[c >> 4]);
output.push_back(lut[c & 15]);
}
return output;
}
std::string SHA256(std::string data)
{
CryptoPP::byte const* pbData = (CryptoPP::byte*)data.data();
unsigned int nDataLen = data.length();
CryptoPP::byte abDigest[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
// return string((char*)abDigest); -- BAD!!!
return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);
}
void test_cryptopp() {
std::cout << string_to_hex(SHA256("abc")) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)