2017-08-10 109 views
1

我試圖用Crypto ++生成一個base64編碼字符串的SHA512。使用Crypto ++ Base64編碼器時避免換行

我的樣本輸入是:test123

的Base64:dGVzdDEyMw==

B64的SHA512(預期):9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2

SHA512計算:

f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626 
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d 

B64(未預期的)的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?

回答

1

SHA512 B64(正確)的:

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的構造函數。您可以在the manualthe 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 */) 
);