Question Comment résoudre le "EVP_DecryptFInal_ex: bad decrypt" lors du déchiffrement du fichier


J'ai la requête suivante. Peut-on me proposer une solution s'il vous plaît.

Je travaille sur le cryptage et le décryptage des fichiers pour la première fois.

J'ai crypté le fichier par invite de commande en utilisant la commande:

openssl enc -aes-256-cbc -in file.txt -out file.enc -k "key value" -iv "iv value"

Je dois le décrypter par programmation. J'ai donc écrit le programme pour cela, mais il génère 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 le chemin du répertoire et recherche le fichier chiffré ".enc" et tente de le déchiffrer lu dans le tampon.

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;
}

Je vous remercie.


11
2017-12-16 05:30


origine


Réponses:


Ce message digital envelope routines: EVP_DecryptFInal_ex: bad decrypt peut également se produire lorsque vous chiffrez et déchiffrez avec une version incompatible de openssl.

Le problème que je rencontrais était que je cryptais sous Windows qui avait la version 1.1.0 et ensuite le décryptage sur un système Linux générique avec 1.0.2g.

Ce n'est pas un message d'erreur très utile!


27
2018-05-08 12:24



Je pense que les clés et IV utilisées pour le chiffrement en utilisant la ligne de commande et le déchiffrement en utilisant votre programme ne sont pas les mêmes.

Veuillez noter que lorsque vous utilisez "-k" (différent de "-K"), l'entrée donnée est considérée comme un mot de passe à partir duquel la clé est dérivée. Généralement, dans ce cas, l'option "-iv" n'est pas nécessaire, car la clé et le mot de passe seront dérivés de l'entrée fournie avec l'option "-k".

Votre question ne précise pas comment vous vous assurez que la clé et l’IV sont les mêmes pour le chiffrement et le déchiffrement.

Dans ma suggestion, mieux vaut utiliser l'option "-K" et "-iv" pour spécifier explicitement la clé et l'IV pendant le chiffrement et utiliser le même pour le déchiffrement. Si vous devez utiliser "-k", utilisez l'option "-p" pour imprimer la clé et l'utiliser pour le chiffrement et utilisez-la dans votre programme de déchiffrement.

Plus de détails peuvent être obtenus à https://www.openssl.org/docs/manmaster/apps/enc.html 


7
2017-12-16 09:57



Ce message peut également apparaître lorsque vous spécifiez le mot de passe de déchiffrement incorrect (Ouais, boiteux, mais pas tout à fait évident pour réaliser ceci du message d'erreur, hein?).

J'utilisais la ligne de commande pour déchiffrer la sauvegarde récente de DataBase pour mon outil auxiliaire et j'ai soudainement rencontré ce problème.

Finalement, après 10 minutes de deuil et en lisant cette question / ces réponses, je me suis souvenu que le mot de passe était différent et que tout fonctionnait correctement avec le mot de passe correct.


0
2018-05-15 11:39



J'ai rencontré une erreur similaire lors de l'utilisation de l'interface de ligne de commande openssl, tout en ayant la clé binaire correcte (-K). L'option "-nopad" a résolu le problème:

Exemple générant 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 résultat correct:
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


0
2018-05-22 12:54