Générer un hash SHA256 avec Crypto++, en utilisant une chaîne comme entrée et sortie?

j'ai besoin d'un exemple d'utilisation de Crypto++ pour générer un hash SHA256 à partir d'une chaîne std::string et produire une chaîne std::string. Je n'arrive pas à le comprendre. Tout ce que j'ai essayé me donne des résultats invalides.

voici le nouveau code après la réponse d'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);
}

la sortie pour SHA256 ("A"); est

enter image description here

comment transformer cela en format lisible?

grâce à la réponse d'interjay j'ai pu générer la finale hachage.

18
demandé sur jww 2011-05-09 00:14:47

3 réponses

Cette ligne permettra de donner des résultats erronés:

unsigned int nDataLen = sizeof(pbData);

Il vous donnera toujours la taille d'un pointeur. Ce que vous voulez à la place est data.size().

aussi, vous n'avez pas besoin de cette partie:

if(!CryptoPP::SHA256().VerifyDigest(abDigest, pbData, nDataLen))
{
    return SHA256(data);
}

Il faut toujours vérifier correctement, puisque vous venez de calculer l'empreinte basés sur les mêmes données. Et si ce n'était pas le cas, vous iriez dans une récursion infinie.

pour obtenir la sortie lisible, vous pouvez la convertir en hex. Voici un exemple pour MD5 de la Crypto++ Wiki, il doit travailler pour vous si vous remplacez le MD5 avec SHA256:

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;  
15
répondu interjay 2015-09-11 12:34:15

cette commande affiche une chaîne de caractères base64 en utilisant le 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;
}
16
répondu Rooke 2018-01-19 10:39:36

votre code s'attendra à une chaîne à fin nulle de la mémoire tampon que vous fournissez au constructeur de chaînes! Ce qui veut dire que le résultat sera certainement mauvais.

Pour appliquer le digest de la taille et de l', utilisez plutôt la syntaxe suivante:

return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);

aussi en ce qui concerne l'impression, ce qui suit produit correctement le vecteur d'essai BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD pour la chaîne "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;
}
0
répondu cryptoboy 2018-02-23 06:27:01