Le chiffrement et le déchiffrement d'erreur 0x0407106B à l'aide d'OpenSSL
Je suis en train d'écrire une routine en C qui lit un fichier crypté en base64 de la chaîne avec la clé publique et le produit pour crypter une chaîne de caractères. J'ai aussi tester la même chaîne de décryptage, mais j'obtiens une erreur 0x0407106B lorsque vous tentez d'effectuer le décodage:
$ openssl errstr 0x0407106B
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
Voici le code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <openssl/rsa.h>
#include <openssl/engine.h>
//#define PADDING RSA_PKCS1_OAEP_PADDING
#define PADDING RSA_PKCS1_PADDING
//#define PADDING RSA_NO_PADDING
main() {
//public key
char *b64_pKey = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp2w+8HUdECo8V5yuKYrWJmUbL\ntD6nSyVifN543axXvNSFzQfWNOGVkMsCo6W4hpl5eHv1p9Hqdcf/ZYQDWCK726u6\nhsZA81AblAOOXKaUaxvFC+ZKRJf+MtUGnv0v7CrGoblm1mMC/OQI1JfSsYi68Epn\naOLepTZw+GLTnusQgwIDAQAB\n-----END PUBLIC KEY-----\n";
//private key
char *b64priv_key = "-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQCp2w+8HUdECo8V5yuKYrWJmUbLtD6nSyVifN543axXvNSFzQfW\nNOGVkMsCo6W4hpl5eHv1p9Hqdcf/ZYQDWCK726u6hsZA81AblAOOXKaUaxvFC+ZK\nRJf+MtUGnv0v7CrGoblm1mMC/OQI1JfSsYi68EpnaOLepTZw+GLTnusQgwIDAQAB\nAoGBAKDuq3PikblH/9YS11AgwjwC++7ZcltzeZJdGTSPY1El2n6Dip9ML0hUjeSM\nROIWtac/nsNcJCnvOnUjK/c3NIAaGJcfRPiH/S0Ga6ROiDfFj2UXAmk/v4wRRUzr\n5lsA0jgEt5qcq2Xr/JPQVGB4wUgL/yQK0dDhW0EdrJ707e3BAkEA1aIHbmcVfCP8\nY/uWuK0lvWxrIWfR5MlHhI8tD9lvkot2kyXiV+jB6/gktwk1QaFsy7dCXn7w03+k\nxrjEGGN+kQJBAMuKf55lDtU9K2Js3YSStTZAXP+Hz7XpoLxmbWFyGvBx806WjgAD\n624irwS+0tBxkERbRcisfb2cXmAx8earT9MCQDZuVCpjBWxd1t66qYpgQ29iAmG+\njBIY3qn9uOOC6RSTiCCx1FvFqDMxRFmGdRVFxeyZwsVE3qNksF0Zko0MPKECQCEe\noDV97DP2iCCz5je0R5hUUM2jo8DOC0GcyR+aGZgWcqjPBrwp5x08t43mHxeb4wW8\ndFZ6+trnntO4TMxkA9ECQB+yCPgO1zisJWYuD46KISoesYhwHe5C1BQElQgi9bio\nU39fFo88w1pok23a2CZBEXguSvCvexeB68OggdDXvy0=\n-----END RSA PRIVATE KEY-----\n";
//String to encrypt
char *str = "1234";
ERR_load_crypto_strings();
BIO *bpo = BIO_new_mem_buf(b64_pKey, -1);
RSA *pubKey = PEM_read_bio_RSA_PUBKEY(bpo, NULL, NULL, NULL);
if ( !pubKey ) {
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
return;
}
int rsa_length = RSA_size(pubKey);
BIO *b64 = NULL;
BIO *bmem = NULL;
BUF_MEM *bptr = NULL;
unsigned char encrypted[2560] = { 0 };
unsigned char retencrypted[2560] = { 0 };
int resultEncrypt = RSA_public_encrypt(PADDING, str, encrypted, pubKey, PADDING);
if ( resultEncrypt == -1 ) {
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
return;
}
/*
* Show base 64 encrypted string
*/
b64 = BIO_new((BIO_METHOD *)BIO_f_base64());
BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, encrypted, resultEncrypt);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
memcpy(retencrypted, bptr->data, bptr->length);
BIO_free(b64);
BIO_free(bpo);
RSA_free(pubKey);
printf("Encrypted string:%s\n",retencrypted);
/*
* Now decrypt this very string with the private key
*/
BIO *bpop = BIO_new_mem_buf(b64priv_key, -1);
RSA *privKey = PEM_read_bio_RSAPrivateKey(bpop, NULL, NULL, NULL);
if ( !privKey ) {
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
return;
}
rsa_length = RSA_size(privKey);
unsigned char decrypted[2560] = { 0 };
int resultDecrypt = RSA_private_decrypt( RSA_size(privKey), retencrypted, decrypted, privKey, PADDING);
if ( resultDecrypt == -1 ) {
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
return;
}
printf("resultDecrypt=%d\ndecrypted string: %s\n",resultDecrypt,decrypted);
BIO_free(bpop);
RSA_free(privKey);
ERR_free_strings();
}
Remarque: j'ai exporté la clé privée à l'aide de
openssl rsa -in rsa_privatekey.pem -check
et la clé publique:
openssl rsa -in rsa_privatekey.pem -pubout
Pourquoi j'obtiens l'erreur?
Avez-vous besoin d'avoir un retour chariot à la fin de votre certificat de chaînes? srdevspot.blogspot.com/2011/08/openssl-error0906d064pem.html
Essayé d'ajouter des sauts de ligne à deux touches, mais le même résultat.
J'ai résolu votre exemple jusqu'ici
Le codage base64 permettre l'utilisation de chaînes de caractères contenant les caractères \0 dans le milieu du tableau de données à chiffrer?
Essayé d'ajouter des sauts de ligne à deux touches, mais le même résultat.
J'ai résolu votre exemple jusqu'ici
Le codage base64 permettre l'utilisation de chaînes de caractères contenant les caractères \0 dans le milieu du tableau de données à chiffrer?
OriginalL'auteur xain | 2011-11-26
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes en essayant de déchiffrer le base64 résultat.
Vous devriez essayer de déchiffrer le résultat du chiffrement.
Qui est, au lieu de:
Vous devriez appeler:
Aussi, il y a un problème dans le cryptage appel:
Pourquoi êtes-vous en passant REMBOURRAGE en
flen
? Cela devrait être la longueur de la chaîne (c'est à dire 4 ou 5, selon que vous souhaitez crypter le caractère nul).Si vous voulez écrire la chaîne cryptée ASCII (codé à l'aide de base64), c'est bien. Mais vous avez à les décoder en arrière avant de le décrypter.
OriginalL'auteur Omri Barel
L'erreur que vous obtenez est type de bloc n'est pas 02.
Bien que Omri est correct que vous êtes de passage de la base de données erronées, et vous allez seulement pour chiffrer 1 octet, l'erreur est parce que la
sizeof( encrypted )
est beaucoup trop grande (2560). En d'autres termes, votre récepteur de données pourRSA_public_encrypt
doit être régulièrementunsigned char*
pointeur, pas ununsigned char[2560]
.Où vous avez
Vous devriez être en utilisant
Avis l'erreur Omri a souligné, que vous avez utilisé
PADDING
comme le premier arg àRSA_public_encrypt
, alors que ce devrait être leDATALEN
longueur de données.Si vous le correctif que vous aurez une erreur similaire, plus tard, avec la clé privée de déchiffrement. De la réparer, et vous êtes sur votre chemin.
OriginalL'auteur bobobobo