使用 Crypto++ Base64 编码器时避免换行
Avoid newline when using Crypto++ Base64 encoder
我正在尝试使用 Crypto++ 生成 base64 编码字符串的 SHA512。
我的样本输入是:test123
Base64: dGVzdDEyMw==
B64 的 SHA512(预期):
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
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?
SHA512 of B64 (correct):
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
听起来好像计算此散列的任何东西都产生了意想不到的结果。这可能是由于换行符、缺少填充等原因造成的。
我可以用下面的方法重现它。这似乎是换行问题。
$ echo 'dGVzdDEyMw' | sha512sum
9c00af94b3dc300fab0fd1fdad7e9eeb20bb0bdff6e6c75d9072e241976b0cc8
56f2a1d355c35f29c3d354895565f971721f58cbb20f0608f57a882b0afb412c
$ echo -n 'dGVzdDEyMw' | sha512sum
c20144e3136f57d5aae2374aa48759911364bb44167fe642cc8b4da140396584
04ce9e2f3dfc9bd69d69cfbb449384e6ea5377c39a07fdb2c2920d78a2a56a80
$ echo 'dGVzdDEyMw==' | sha512sum
9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23
bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2
$ echo -n 'dGVzdDEyMw==' | sha512sum
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
这是 Base64Encoder
. You can find the docs at either the manual or the wiki 的构造函数。
Base64Encoder(BufferedTransformation *attachment = NULL,
bool insertLineBreaks = true,
int maxLineLength = 72)
你应该使用 insertLineBreaks = false
。可能是这样的:
StringSource ss((byte*)test.data(), test.size(), true,
new Base64Encoder(new StringSink(encoded), false /* Newline */));
由于您使用的是 Pipeline,您可以使用以下方法一次性完成。当数据从源流向接收器时,我展开了所有 new
以帮助可视化。
SHA512 hash;
StringSource ss(test /* std::string */, true,
new Base64Encoder(
new HashFilter(hash,
new StringSink(encoded)
),
false /* Newline */)
);
我正在尝试使用 Crypto++ 生成 base64 编码字符串的 SHA512。
我的样本输入是:test123
Base64: dGVzdDEyMw==
B64 的 SHA512(预期):
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
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?
SHA512 of B64 (correct):
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626 ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
听起来好像计算此散列的任何东西都产生了意想不到的结果。这可能是由于换行符、缺少填充等原因造成的。
我可以用下面的方法重现它。这似乎是换行问题。
$ echo 'dGVzdDEyMw' | sha512sum
9c00af94b3dc300fab0fd1fdad7e9eeb20bb0bdff6e6c75d9072e241976b0cc8
56f2a1d355c35f29c3d354895565f971721f58cbb20f0608f57a882b0afb412c
$ echo -n 'dGVzdDEyMw' | sha512sum
c20144e3136f57d5aae2374aa48759911364bb44167fe642cc8b4da140396584
04ce9e2f3dfc9bd69d69cfbb449384e6ea5377c39a07fdb2c2920d78a2a56a80
$ echo 'dGVzdDEyMw==' | sha512sum
9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23
bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2
$ echo -n 'dGVzdDEyMw==' | sha512sum
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d
这是 Base64Encoder
. You can find the docs at either the manual or the wiki 的构造函数。
Base64Encoder(BufferedTransformation *attachment = NULL,
bool insertLineBreaks = true,
int maxLineLength = 72)
你应该使用 insertLineBreaks = false
。可能是这样的:
StringSource ss((byte*)test.data(), test.size(), true,
new Base64Encoder(new StringSink(encoded), false /* Newline */));
由于您使用的是 Pipeline,您可以使用以下方法一次性完成。当数据从源流向接收器时,我展开了所有 new
以帮助可视化。
SHA512 hash;
StringSource ss(test /* std::string */, true,
new Base64Encoder(
new HashFilter(hash,
new StringSink(encoded)
),
false /* Newline */)
);