AES (aes-cbc-128, aes-cbc-192, aes-cbc-256) de cryptage / décryptage avec openssl C

Je veux juste tester AES depuis openSSL avec ces 3 modes: avec 128 192 et 256 longueurs de clé, mais mon texte déchiffré est différent de celui que j’ai saisi et je ne sais pas pourquoi. De plus, quand je passe une longueur d’entrée énorme (disons 1024 octets), mon programme affiche le core dumped … Mon entrée est toujours la même mais peu importe, du moins pour le moment. Heres le code:

 #include  #include  #include  #include  int main(int argc, char **argv) { int i; int keylength; printf("Give a key length [only 128 or 192 or 256!]:\n"); scanf("%d", &keylength); /* generate a key with a given length */ unsigned char aes_key[keylength]; memset(aes_key, 0, sizeof(aes_key)); if (!RAND_bytes(aes_key, keylength)) { exit(-1); } aes_key[keylength-1] = '\0'; int inputslength; printf("Give an input's length:\n"); scanf("%d", &inputslength); /* generate input with a given length */ unsigned char aes_input[inputslength+1]; memset(aes_input, '0', sizeof(aes_input)); aes_input[inputslength] = '\0'; /*printf("original:\t"); for(i=0; i<inputslength; i++) { printf("%c ", aes_input[i]); } printf("\n");*/ /* init vector */ unsigned char iv[AES_BLOCK_SIZE]; if (!RAND_bytes(iv, AES_BLOCK_SIZE)) { exit(-1); } //printf("AES_BLOCK_SIZE = %d\n", AES_BLOCK_SIZE); // aes block size is 16 bytes = 128 bits AES_KEY enc_key, dec_key; unsigned char enc_out[AES_BLOCK_SIZE]; unsigned char dec_out[AES_BLOCK_SIZE]; // so i can do with this aes-cbc-128 aes-cbc-192 aes-cbc-256 AES_set_encrypt_key(aes_key, keylength, &enc_key); AES_cbc_encrypt(aes_input, enc_out, inputslength, &enc_key, iv, AES_ENCRYPT); AES_set_decrypt_key(aes_key, keylength, &dec_key); AES_decrypt(enc_out, dec_out, &dec_key); printf("original:\t"); for(i=0;*(aes_input+i)!=0x00;i++) printf("%X ",*(aes_input+i)); printf("\nencrypted:\t"); for(i=0;*(enc_out+i)!=0x00;i++) printf("%X ",*(enc_out+i)); printf("\ndecrypted:\t"); for(i=0;*(dec_out+i)!=0x00;i++) printf("%X ",*(dec_out+i)); printf("\n"); /*printf("\n\noriginal:\t"); for(i=0; i<inputslength; i++) { printf("%x ", dec_out[i]); } printf("\n");*/ return 0; } 

MODIFIER:

Lorsque j’ai modifié les tailles de sortie en inputslength d’ inputslength au lieu de AES_BLOCK_SIZE j’ai obtenu des résultats:

 Give a key length [only 128 or 192 or 256!]: 128 Give an input's length: 5 original: 30 30 30 30 30 encrypted: 94 56 50 7E 19 B2 1C CE 20 23 4A E7 10 AF DB E3 30 30 30 30 30 decrypted: E1 5F F4 3D E8 8D 91 19 CD 3E 22 1E AF 1C 8F 5A 94 56 50 7E 19 B2 1C CE 20 23 4A E7 10 AF DB E3 30 30 30 30 30 

Alors, est-il possible qu’il y ait un problème avec la taille de l’avant et de la taille du iv? Quelles tailles devraient-ils avoir (pour AES-CBC-128, AES-CBC-192, AES-CBC-256)?

Jetez un coup d’œil à cette version modifiée de votre code. Notez les points suivants:

  1. Hex_print ajouté (mineur)
  2. Ajout du dimensionnement correct du tampon de clé (moyen).
  3. Ajout du dimensionnement approprié du tampon de chiffrement de sortie (qui doit être un multiple de taille de bloc. Si le tampon source d’origine est un multiple de taille de bloc exacte, vous avez toujours besoin d’un bloc de remplissage intégral (voir PKCS 5 pour plus d’informations).
  4. Même IV utilisé à la fois pour chiffrer et déchiffrer.
  5. Enfin, aussi étrange que cela puisse paraître, AES_cbc_encrypt() est utilisé à la fois pour le chiffrement et le déchiffrement (voir le dernier paramètre de l’appel).

Code source

 #include  #include  #include  #include  #include  // a simple hex-print routine. could be modified to print 16 bytes-per-line static void hex_print(const void* pv, size_t len) { const unsigned char * p = (const unsigned char*)pv; if (NULL == pv) printf("NULL"); else { size_t i = 0; for (; i 

Test de sortie

 Give a key length [only 128 or 192 or 256!]: 128 Give an input's length: 10 original: 58 58 58 58 58 58 58 58 58 58 encrypt: A9 66 C5 24 A4 02 AB 96 08 65 F7 22 A5 FB BE 26 decrypt: 58 58 58 58 58 58 58 58 58 58 

Deuxième sortie de test

 Give a key length [only 128 or 192 or 256!]: 128 Give an input's length: 10 original: 58 58 58 58 58 58 58 58 58 58 encrypt: C2 47 6D B1 A1 68 29 53 55 74 C5 CC 3F 27 0A 3F decrypt: 58 58 58 58 58 58 58 58 58 58 

J'espère sincèrement que cela aide.

@WhozCraig: merci beaucoup pour votre aide! Cela m’a beaucoup expliqué! Mais theres juste un autre problème. J’ai changé les tableaux statiques en tableaux dynamics. Quand je l’ai fait, des erreurs se sont produites. Mais ils ne se produisent que lorsque je donne une taille d’entrée énorme, jetez un coup d’œil à la sortie de valgrind: http://pastie.org/private/bzofrrtgrlzr0doyb3g . L’erreur se produit uniquement lorsque je passe une entrée énorme, lorsque je passe une petite taille (comme dans votre exemple, 10), c’est bon. Tout le rest fonctionne parfaitement.

 #include  #include  #include  #include  #include  // a simple hex-print routine. could be modified to print 16 bytes-per-line static void hex_print(const void* pv, size_t len) { const unsigned char * p = (const unsigned char*)pv; if (NULL == pv) printf("NULL"); else { size_t i = 0; for (; i 

MODIFIER:

Ok, quelque chose n'allait pas avec le code précédent que j'ai posté, voici un nouveau qui fonctionne parfaitement, même pour une entrée énorme. Vive encore une fois pour m'aider! 🙂

 #include  #include  #include  #include  #include  // a simple hex-print routine. could be modified to print 16 bytes-per-line static void hex_print(const void* pv, size_t len) { const unsigned char * p = (const unsigned char*)pv; if (NULL == pv) printf("NULL"); else { size_t i = 0; for (; i