2017-08-10 3 views
1

Je tente de générer le SHA512 d'une chaîne codée en base64 avec Crypto ++.Éviter le retour à la ligne lors de l'utilisation de l'encodeur Crypto ++ Base64

Mon entrée d'échantillon est la suivante: test123

base64: dGVzdDEyMw==

SHA512 de B64 (attendu):

f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626 
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d 

SHA512 de B64 (non prévu): 9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2

calcul de 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()); 

Si je laisse de base64 et calculer le SHA512 directement, je reçois le hachage correct. Par conséquent, le calcul ne peut pas être complètement faux.

Mais pourquoi cela ne fonctionne-t-il pas avec base64?

Répondre

1

SHA512 de B64 (correct):

f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626 
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d 

On dirait que tout ce qui est le calcul de ce hachage produit des résultats inattendus. C'est probablement dû à un retour à la ligne, un remplissage manquant, etc.

Je peux le reproduire avec ce qui suit. Il semble être un problème de nouvelle ligne.

$ echo 'dGVzdDEyMw' | sha512sum 
9c00af94b3dc300fab0fd1fdad7e9eeb20bb0bdff6e6c75d9072e241976b0cc8 
56f2a1d355c35f29c3d354895565f971721f58cbb20f0608f57a882b0afb412c 

$ echo -n 'dGVzdDEyMw' | sha512sum 
c20144e3136f57d5aae2374aa48759911364bb44167fe642cc8b4da140396584 
04ce9e2f3dfc9bd69d69cfbb449384e6ea5377c39a07fdb2c2920d78a2a56a80 

$ echo 'dGVzdDEyMw==' | sha512sum 
9f012fff26c89f2650f7446a37e80ba6466d69ffc77bb9ffc8c09ab779b24a23 
bb6a2f3c28512668ebca8628303ab5a31067d930cd1af60c745a2c34e5b4b1d2 

$ echo -n 'dGVzdDEyMw==' | sha512sum 
f78fa0aa79abd53b8181c5d21bdeb882bf45cd462a6e6e1b5043417de1800626 
ed2a51b1a56626e9b9558da66a2f609d31db76bd88e80afbb7b03cda518b207d 

Voici le constructeur de Base64Encoder. Vous pouvez trouver les documents au the manual ou the wiki.

Base64Encoder(BufferedTransformation *attachment = NULL, 
       bool insertLineBreaks = true, 
       int maxLineLength = 72) 

Vous devez utiliser insertLineBreaks = false. Peut-être quelque chose comme:

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

Puisque vous utilisez un Pipeline, vous pouvez le faire en un seul coup avec ce qui suit. J'ai déroulé tous les new pour aider à la visualisation comme les flux de données de la source vers le puits.

SHA512 hash; 
StringSource ss(test /* std::string */, true, 
    new Base64Encoder(
     new HashFilter(hash, 
      new StringSink(encoded) 
     ), 
    false /* Newline */) 
);