2017-08-23 3 views
-1

J'ai inclus a full, basic code example qui peut être compilé avec la commande suivante (avec boost installé) "g ++ -std = C++ 11 -g test.cpp -lssl -lcrypto -lboost_system "C++ OpenSSL EVP_DigestVerify échoue par intermittence rsa_pk1.c: 103 avec RSA_R_BAD_PAD_BYTE_COUNT

Le code que j'ai suivi de près le OpenSSL EVP Signing and Vering Asymmetric example avec un peu de refactoring Boost pour la gestion de la mémoire.

Cependant, son comportement est très intermittent et change avec différentes clés ainsi que du texte différent. Je suis sûr qu'il me manque quelque chose ici mais en raison des contraintes de temps je suis sur le point de faire un appel système sécurisé à l'utilitaire openssl avec lequel je n'ai eu aucun problème.

La sortie de test ci-dessous illustre le problème. "A" et "AAA" sont signés et vérifiés avec succès, alors que "AA" échoue avec une erreur de remplissage RSA_R_BAD_PAD_BYTE_COUNT. Pour essayer ceci, j'ai mis le padding à PKCS mais cela n'a pas fait de différence.

2048 bit [2] - Text: A - Success 
Authentication failure: 67567722, rsa_pk1.c, 103, , 0 257 
Error string: error:0407006A:lib(4):func(112):reason(106) 
2048 bit [2] - Text: AA - Failure 
2048 bit [2] - Text: AAA - Success 

Les pointeurs ici seraient très appréciés!

+0

Veuillez montrer votre code. Puisque Stack Overflow cache la raison Close de votre part: * Les questions qui cherchent l'aide de débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure le comportement désiré, un problème ou une erreur spécifique et le code le plus court . Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: [Comment créer un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). * – jww

+0

Vous trouverez un lien sur la première ligne du code – mgibson

Répondre

3

La question a à voir avec la façon dont vous convertir char* en string intérieur testSignVerify:

string hashString((char*)pHash.get()); 

devrait être:

string hashString(pHash.get(), hashLength); 

Il est parce que le constructeur de chaîne par défaut s'arrêtera le premier '\0' il rencontre, ce qui est OK pour les chaînes normales, mais pour le hachage cryptographique, c'est juste un des caractères possibles.