encrypt c encryption openssl

encrypt - openssl aes



Cómo resolver el "EVP_DecryptFInal_ex: descifrado incorrecto" durante el descifrado del archivo (2)

Creo que la clave y el IV utilizados para el cifrado utilizando la línea de comandos y el descifrado con su programa no son los mismos.

Tenga en cuenta que cuando utiliza la "-k" (diferente de "-K"), la entrada dada se considera como una contraseña de la que se deriva la clave. En general, en este caso, no hay necesidad de la opción "-iv" ya que tanto la clave como la contraseña se derivarán de la entrada dada con la opción "-k".

No está claro a partir de su pregunta, cómo se está asegurando de que Key y IV sean iguales entre el cifrado y el descifrado.

En mi sugerencia, es mejor usar la opción "-K" y "-iv" para especificar explícitamente la clave y IV durante el cifrado y usar el mismo para el descifrado. Si necesita usar "-k", utilice la opción "-p" para imprimir la clave y iv utilizados para el cifrado y utilícela en su programa de descifrado.

Se pueden obtener más detalles en https://www.openssl.org/docs/manmaster/apps/enc.html

Tengo la siguiente consulta. ¿Podría alguien sugerirme una solución?

Estoy trabajando en el cifrado y descifrado del archivo por primera vez.

He cifrado el archivo a través del símbolo del sistema con el comando:

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

Tengo que descifrarlo programáticamente. Así que escribí el programa para ello, pero arroja el siguiente error:

./exe_file enc_file_directory ... error: 06065064: digital envelope routines: EVP_DecryptFInal_ex: bad decrypt: evp_enc.c

El siguiente programa toma entrada como ruta de directorio y busca el archivo cifrado ".enc" y trata de descifrar la lectura en el búfer.

Código:

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

Gracias.


Este mensaje digital envelope routines: EVP_DecryptFInal_ex: bad decrypt también puede ocurrir al cifrar y descifrar con versiones incompatibles de openssl.

El problema que estaba teniendo era que estaba encriptando en Windows que tenía la versión 1.1.0 y luego descifrando en un sistema Linux genérico que tenía 1.0.2g.

¡No es un mensaje de error muy útil!