Comment faire pour résoudre le “EVP_DecryptFInal_ex: bad déchiffrer” au cours de cryptage de fichier
J'ai la requête suivante.Pouvait-on s'il vous plaît me suggérer une solution.
Je suis en train de travailler sur le cryptage et de décryptage de fichier pour la première fois.
J'ai crypté fichier via l'invite de commande à l'aide de la commande:
openssl enc -aes-256-cbc -in file.txt -out file.enc -k "key value" -iv "iv value"
J'ai pour le décrypter par programmation. Donc, j'ai écrit le programme, mais il est en train de jeter l'erreur suivante:
./exe_file enc_file_directory
...
error: 06065064: digital envelope routines: EVP_DecryptFInal_ex: bad decrypt: evp_enc.c
Le programme ci-dessous prend en entrée comme chemin d'accès au répertoire et de recherche pour le fichier crypté ".enc" et d'essayer de décrypter lire dans le buffer.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/conf.h>
#include <libxml/globals.h>
void handleErrors(char *msg)
{
{
ERR_print_errors_fp(stderr);
printf("%s", msg);
abort();
}
}
void freeMemory(char *mem)
{
if (NULL != mem)
{
free(mem);
mem = NULL;
}
}
/* Function to decrypt the XML files */
int decryptXML(unsigned char *indata, unsigned char *outdata, int fsize)
{
int outlen1 = 0, outlen2 = 0;
unsigned char iv[] = "b63e541bc9ece19a1339df4f8720dcc3";
unsigned char ckey[] = "70bbc518c57acca2c2001694648c40ddaf19e3b4fe1376ad656de8887a0a5ec2" ;
if (NULL == indata)
{
printf ("input data is empty\n");
return 0;
}
if (0 >= fsize)
{
printf ("file size is zero\n");
return 0;
}
outdata = (char *) malloc (sizeof (char) * fsize * 2);
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if (! EVP_DecryptInit_ex (&ctx, EVP_aes_256_cbc(), NULL, ckey, iv))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DInit");
}
if (! EVP_DecryptUpdate (&ctx, outdata, &outlen1, indata, fsize))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DUpdate");
}
if (! EVP_DecryptFinal_ex (&ctx, outdata + outlen1, &outlen2))
{
EVP_CIPHER_CTX_cleanup(&ctx);
handleErrors("DFinal");
}
EVP_CIPHER_CTX_cleanup(&ctx);
return outlen1+outlen2;
}
int isDirectory(char *path)
{
DIR *dir = NULL;
FILE *fin = NULL, *fout = NULL;
int enc_len = 0, dec_len = 0, fsize = 0, ksize = 0;
unsigned char *indata = NULL, *outdata = NULL;
char buff[BUFFER_SIZE], file_path[BUFFER_SIZE], cur_dir[BUFFER_SIZE];
struct dirent *in_dir;
struct stat s;
if (NULL == (dir = opendir(path)))
{
printf ("ERROR: Failed to open the directory %s\n", path);
perror("cannot open.");
exit(1);
}
while (NULL != (in_dir = readdir(dir)))
{
if (!strcmp (in_dir->d_name, ".") || !strcmp(in_dir->d_name, ".."))
continue;
sprintf (buff, "%s/%s", path, in_dir->d_name);
if (-1 == stat(buff, &s))
{
perror("stat");
exit(1);
}
if (S_ISDIR(s.st_mode))
{
isDirectory(buff);
}
else
{
strcpy(file_path, buff);
if (strstr(file_path, ".enc"))
{
/* File to be decrypted */
fout = fopen(file_path,"rb");
fseek (fout, 0L, SEEK_END);
fsize = ftell(fout);
fseek (fout, 0L, SEEK_SET);
indata = (char*)malloc(fsize);
fread (indata, sizeof(char), fsize, fout);
if (NULL == fout)
{
perror("Cannot open enc file: ");
return 1;
}
dec_len = decryptXML (indata, outdata, fsize);
outdata[dec_len] = '\0';
printf ("%s\n", outdata);
fclose (fin);
fclose (fout);
}
}
}
closedir(dir);
freeMemory(outdata);
freeMemory(indata);
return 1;
}
int main(int argc, char *argv[])
{
int result;
if (argc != 2)
{
printf ("Usage: <executable> path_of_the_files\n");
return -1;
}
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(NULL);
/* Checking for the directory existance */
result = isDirectory(argv[1]);
EVP_cleanup();
ERR_free_strings();
if (0 == result)
return 1;
else
return 0;
}
Merci.
Le mode CBC assure la confidentialité seulement, et généralement vous devez ajouter un MAC pour utiliser le mode CBC en toute sécurité. Vous devriez probablement être authentifié à l'aide de chiffrement, car il fournit des confidentialité et l'authenticité. Voir EVP Authentifié de Chiffrement et de Déchiffrement sur la OpenSSL wiki.
Simplifier votre code. En finir avec tous le système de fichiers en lecture. Crypter un fichier et essayer de décrypter ce fichier. Le débogage est beaucoup plus facile ensuite.
Merci pour la réponse. Avez-vous dire que l'utilisation des appels système du programme ?
Simplifier votre code. En finir avec tous le système de fichiers en lecture. Crypter un fichier et essayer de décrypter ce fichier. Le débogage est beaucoup plus facile ensuite.
Merci pour la réponse. Avez-vous dire que l'utilisation des appels système du programme ?
OriginalL'auteur Sai | 2015-12-16
Vous devez vous connecter pour publier un commentaire.
Ce message
digital envelope routines: EVP_DecryptFInal_ex: bad decrypt
peut également se produire lorsque vous chiffrer et déchiffrer avec une incompatibilité de versions d'openssl.La question j'ai eu était que j'étais le chiffrement sur Windows qui avait la version 1.1.0 et puis décryptage sur un générique de système Linux qui avait 1.0.2 g.
Il n'est pas très utile de message d'erreur!
-md sha256
ou-md md5
respectivementMerci! L'ajout de
-md md5
résolu le problème pour moi.J'ai juste mis à niveau à partir de Kubuntu artistique à Kubuntu bionique qui ont mis à jour d'openssl à partir de la version 1.0.2 g pour 1.1.0 g et j'étais incapable de déchiffrer certains fichiers. Le hachage par défaut utilisé par
openssl enc
pour le mot de passe en fonction de dérivation de clé changé dans la version 1.1.0 SHA256 contre MD5 dans les versions inférieures (source). Ma solution a été de télécharger l'ancienneopenssl
paquet, la force de l'installer avecdpkg
, de déchiffrer les fichier(s), force la mise à jour de laopenssl
package à partir du référentiel (à l'aide de Synaptic par exemple) et de crypter les fichiers à nouveau.s'il vous plaît mettez votre commentaire est une réponse afin que je puisse upvote.
pls poster une réponse. parce que c'est
OriginalL'auteur Sean Dawson
Je pense que la Clé et IV utilisée pour le chiffrement à l'aide de la ligne de commande et de déchiffrement à l'aide de votre programme ne sont pas les mêmes.
Veuillez noter que lorsque vous utilisez l'option "-k" (différent de "-K"), l'entrée est considérée comme un mot de passe à partir de laquelle la clé est dérivée. Généralement dans ce cas, il n'est pas nécessaire pour le "iv" option comme à la fois la clé et le mot de passe sera dérivée de l'entrée de donnée avec l'option "-k" option.
Il n'est pas clair à partir de votre question, comment vous assurer que la Clé et IV sont les mêmes entre le chiffrement et le déchiffrement.
Dans ma suggestion, une meilleure utilisation "-K" et "iv" option pour spécifier explicitement la Clé et IV au cours de chiffrement et d'utiliser le même pour le décryptage. Si vous avez besoin d'utiliser "-k", puis utiliser l'option "-p" pour imprimer la clé et iv utilisée pour le chiffrement et d'utiliser le même dans votre programme de décryptage.
Plus de détails peuvent être obtenus à https://www.openssl.org/docs/manmaster/apps/enc.html
Si cela répond à votre question, s'il vous plaît marquer comme la réponse à ce fil. L'autre réponse est utile pour une raison différente, mais par ce marquage comme la réponse à votre problème spécifique, il précise que ce thread n'est pas un doublon de celle liée à l'autre réponse.
OriginalL'auteur Jay
J'ai vécu une semblable réponse d'erreur tout en utilisant la ligne de commande openssl interface, tout en ayant la bonne clé binaire (-K). L'option "-nopad" a résolu le problème:
Exemple générer l'erreur:
echo -ne "\x32\xc8\xde\x5c\x68\x19\x7e\x53\xa5\x75\xe1\x76\x1d\x20\x16\xb2\x72\xd8\x40\x87\x25\xb3\x71\x21\x89\xf6\xca\x46\x9f\xd0\x0d\x08\x65\x49\x23\x30\x1f\xe0\x38\x48\x70\xdb\x3b\xa8\x56\xb5\x4a\xc6\x09\x9e\x6c\x31\xce\x60\xee\xa2\x58\x72\xf6\xb5\x74\xa8\x9d\x0c" | openssl aes-128-cbc -d -K 31323334353637383930313233343536 -iv 79169625096006022424242424242424 | od -t x1
Résultat:
bad decrypt
140181876450560:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:../crypto/evp/evp_enc.c:535:
0000000 2f 2f 07 02 54 0b 00 00 00 00 00 00 04 29 00 00
0000020 00 00 04 a9 ff 01 00 00 00 00 04 a9 ff 02 00 00
0000040 00 00 04 a9 ff 03 00 00 00 00 0d 79 0a 30 36 38
Exemple avec un bon résultat:
echo -ne "\x32\xc8\xde\x5c\x68\x19\x7e\x53\xa5\x75\xe1\x76\x1d\x20\x16\xb2\x72\xd8\x40\x87\x25\xb3\x71\x21\x89\xf6\xca\x46\x9f\xd0\x0d\x08\x65\x49\x23\x30\x1f\xe0\x38\x48\x70\xdb\x3b\xa8\x56\xb5\x4a\xc6\x09\x9e\x6c\x31\xce\x60\xee\xa2\x58\x72\xf6\xb5\x74\xa8\x9d\x0c" | openssl aes-128-cbc -d -K 31323334353637383930313233343536 -iv 79169625096006022424242424242424 -nopad | od -t x1
Résultat:
0000000 2f 2f 07 02 54 0b 00 00 00 00 00 00 04 29 00 00
0000020 00 00 04 a9 ff 01 00 00 00 00 04 a9 ff 02 00 00
0000040 00 00 04 a9 ff 03 00 00 00 00 0d 79 0a 30 36 38
0000060 30 30 30 34 31 33 31 2f 2f 2f 2f 2f 2f 2f 2f 2f
0000100
OriginalL'auteur Tobias Braune
Ce message peut également se produire lorsque vous spécifiez le incorrecte mot de passe de déchiffrement (ouais, boiteux, mais pas tout à fait évident à réaliser ce à partir du message d'erreur, hein?).
J'ai été en utilisant la ligne de commande pour décrypter la récente sauvegarde de Base de données pour mon outil auxiliaire et soudain confrontés à ce problème.
Enfin, après 10 minutes de chagrin et de plus la lecture par le biais de cette question/réponses-je rappeler que le mot de passe est différent et tout a très bien fonctionné avec le mot de passe correct.
OriginalL'auteur RAM237