C++ 使用加密+时避免换行+;Base64编码器

C++ 使用加密+时避免换行+;Base64编码器,c++,base64,crypto++,sha512,C++,Base64,Crypto++,Sha512,我试图用Crypto++生成base64编码字符串的SHA512 我的示例输入是:test123 Base64:dGVzdDEyMw== B64的SHA512(预期值): B64的SHA512(非预期):9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2 SHA512计算: byte *dig

我试图用Crypto++生成base64编码字符串的SHA512

我的示例输入是:
test123

Base64:
dGVzdDEyMw==

B64的SHA512(预期值):

B64的SHA512(非预期):
9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2

SHA512计算:

byte *digest = new byte[CryptoPP::SHA512::DIGESTSIZE];
std::string encoded;
std::string test("test123");

CryptoPP::StringSource ss((byte*)test.data(), test.size(), true, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded))); // StringSource

// Calculate hash
CryptoPP::SHA512().CalculateDigest(digest, (byte*)encoded.data(), encoded.size());
如果我省略base64并直接计算SHA512,则得到正确的散列。因此,计算不可能完全错误

但是为什么base64不起作用呢

B64的SHA512(正确):

听起来无论是什么在计算这个散列都会产生意想不到的结果。这可能是因为换行、缺少填充等原因

我可以用下面的方法复制它。这似乎是一个新的问题

$echo'dGVzdDEyMw'| sha512sum
9C00AF94B3DC300FAB0FD1FDDAD7E9EEB20BB0BDFF6E6C75D9072E241976B0CC8
56f2a1d355c35f29c3d354895565f971721f58cbb20f0608f57a882b0afb412c
$echo-n'dGVzdDEyMw'| sha512sum
c20144e3136f57d5aae2374aa48759911364bb44167fe642cc8b4da140396584
04ce9e2f3dfc9bd69d69cfbb449384e6ea5377c39a07fdb2c2920d78a2a56a80
$echo'dGVzdDEyMw='| sha512sum
9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23
bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2
$echo-n'dGVzdDEyMw='| sha512sum
F78FA0AA79ABD53B81C5D21BDB882BF45CD462A6E6E1B5043417DE1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
这是的构造函数。您可以在或中找到这些文档

base64编码器(BufferedTransformation*附件=NULL,
bool insertLineBreaks=真,
int maxLineLength=72)
您应该使用
insertLineBreaks=false
。可能是这样的:

StringSource ss((byte*)test.data(), test.size(), true,
    new Base64Encoder(new StringSink(encoded), false /* Newline */));
由于您使用的是,您可以通过以下操作一次性完成。我展开了所有的
新的
,以帮助实现数据从源流向接收器的可视化

SHA512散列;
StringSource ss(测试/*标准::字符串*/,真,
新型Base64编码器(
新哈希过滤器(哈希,
新的字符串接收器(编码)
),
false/*换行符*/)
);
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
StringSource ss((byte*)test.data(), test.size(), true,
    new Base64Encoder(new StringSink(encoded), false /* Newline */));