Ich muss es programmgesteuert entschlüsseln. Also habe ich das Programm dafür geschrieben, aber es wirft den folgenden Fehler:
./exe_file enc_file_directory
...
error: 06065064: digital envelope routines: EVP_DecryptFInal_ex: bad decrypt: evp_enc.c
Das folgende Programm nimmt die Eingabe als Verzeichnispfad und sucht nach der verschlüsselten Datei “.enc” und versucht, sie in den Puffer eingelesen zu entschlüsseln.
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;
}
Vielen Dank.
Der CBC-Modus bietet nur Vertraulichkeit, und Sie müssen normalerweise einen MAC hinzufügen, um den CBC-Modus sicher zu verwenden. Sie sollten wahrscheinlich eine authentifizierte Verschlüsselung verwenden, da diese bereitgestellt wird beide Vertraulichkeit und Authentizität. Sehen EVP-authentifizierte Verschlüsselung und Entschlüsselung im OpenSSL-Wiki.
– jww
16. Dezember 2015 um 6:47 Uhr
Vereinfachen Sie Ihren Code. Verzichten Sie auf das Lesen des Dateisystems. Verschlüsseln Sie eine Datei und versuchen Sie, diese Datei zu entschlüsseln. Das Debuggen ist dann viel einfacher.
– adlag
16. Dezember 2015 um 11:37 Uhr
Danke für Ihre Antwort. Meinten Sie die Verwendung von Systemaufrufen aus dem Programm?
– Sai
17. Dezember 2015 um 6:16 Uhr
Sean Dawson
Diese Nachricht digital envelope routines: EVP_DecryptFInal_ex: bad decrypt kann auch auftreten, wenn Sie mit einer inkompatiblen Version von openssl verschlüsseln und entschlüsseln.
Das Problem, das ich hatte, war, dass ich unter Windows mit Version 1.1.0 verschlüsselte und dann auf einem generischen Linux-System mit 1.0.2g entschlüsselte.
Es ist keine sehr hilfreiche Fehlermeldung!
Arbeitslösung:
Eine mögliche Lösung von @AndrewSavinykh, die für viele funktioniert hat (siehe Kommentare):
Der Standard-Digest hat sich zwischen diesen Versionen von md5 zu sha256 geändert. Man kann den Standard-Digest auf der Kommandozeile als angeben -md sha256 oder -md md5 beziehungsweise
Siehe hier: stackoverflow.com/a/39641378/284111 Der Standard-Digest hat sich zwischen diesen Versionen von md5 zu sha256 geändert. Man kann den Standard-Digest auf der Kommandozeile als angeben -md sha256 oder -md md5 beziehungsweise
– Andreas Savinych
8. Juni 2017 um 4:23 Uhr
Ich habe gerade ein Upgrade von Kubuntu Artful auf Kubuntu Bionic durchgeführt, das Openssl von 1.0.2g auf 1.1.0g aktualisiert hat, und ich konnte einige Dateien nicht entschlüsseln. Der Standard-Hash, der von verwendet wird openssl enc für passwortbasierte Schlüsselableitung geändert in 1.1.0 auf SHA256 gegenüber MD5 in niedrigeren Versionen (Quelle). Meine Lösung war Laden Sie die ältere herunter openssl Paketerzwingen Sie die Installation mit dpkgentschlüsseln Sie die Datei(en), erzwingen Sie die Aktualisierung der openssl Paket aus dem Repository (zum Beispiel mit Synaptic) und verschlüsseln Sie die Dateien erneut.
– Stéphane Tréboux
27. Mai 2018 um 11:08 Uhr
@AndrewSavinykh Bitte geben Sie Ihren Kommentar als Antwort ein, damit ich ihn positiv bewerten kann.
– Bryan
26. Juni 2018 um 11:03 Uhr
@AndrewSavinykh Bitte poste es als Antwort. denn es ist
– oᴉɹǝɥɔ
2. August 2018 um 17:59 Uhr
Danke für die Antwort! Jedenfalls muss gesagt werden – Leute von openssl sind Vollidioten. Dies ist kein Spielzeugprogramm, es ist kein Taschenrechner oder irgendein Spiel, im Ernst … Leute wie ich haben wichtige Sachen mit diesem Programm verschlüsselt. Finanzielles und Rechtliches! Wenn ich also vor ein paar Jahren plötzlich ein verschlüsseltes Dokument benötige und anstelle eines Dokuments oder zumindest einer Information “benutze openssl mit Version X zum Entschlüsseln”, bekomme ich eine dumme “schlechte Entschlüsselung” -Nachricht, es ist wie ein Herzinfarkt.
– LLL
4. November 2020 um 8:46 Uhr
Tobias Braun
Bei der Verwendung der Openssl-Befehlszeilenschnittstelle habe ich eine ähnliche Fehlermeldung erhalten, obwohl ich den richtigen Binärschlüssel (-K) hatte. Die Option “-nopad” löste das Problem:
Ich denke, der Schlüssel und der IV, die für die Verschlüsselung über die Befehlszeile und die Entschlüsselung mit Ihrem Programm verwendet werden, sind nicht gleich.
Bitte beachten Sie, dass bei Verwendung des „-k“ (anders als „-K“) die Eingabe als Passwort gewertet wird, aus dem der Schlüssel abgeleitet wird. Im Allgemeinen ist in diesem Fall die Option „-iv“ nicht erforderlich, da sowohl der Schlüssel als auch das Passwort von der Eingabe mit der Option „-k“ abgeleitet werden.
Aus Ihrer Frage geht nicht hervor, wie Sie sicherstellen, dass der Schlüssel und der IV zwischen Verschlüsselung und Entschlüsselung gleich sind.
Verwenden Sie in meinem Vorschlag besser die Optionen „-K“ und „-iv“, um den Schlüssel und den IV während der Verschlüsselung explizit anzugeben, und verwenden Sie dieselben für die Entschlüsselung. Wenn Sie “-k” verwenden müssen, verwenden Sie die Option “-p”, um den Schlüssel und das iv für die Verschlüsselung auszudrucken, und verwenden Sie dieselben in Ihrem Entschlüsselungsprogramm.
Danke Jay. ja! Sie hatten Recht, es wurde nicht der richtige Schlüssel und iv-Wert erhalten. Es hat ein einfaches Programm mit Ihrem Vorschlag ausprobiert (mit den Optionen -K, -iv und -p) und es hat funktioniert. Ich habe hier noch eine Frage. Ich habe mit diesem Befehl einen privaten Schlüssel generiert openssl genrsa -out key.pem 2048 Ich habe eine Datei mit diesem Schlüssel wie unten verschlüsselt openssl enc -aes-256-cbc -in rand_bytes.c -out rand_bytes.enc -kfile key.pem Jetzt ist die Frage, ich muss denselben Schlüssel lesen, um die Datei mit OpenSSL EVP APIs zu entschlüsseln. Können Sie mir vorschlagen, wie es erreicht werden kann. Vielen Dank.
– Sai
17. Dezember 2015 um 6:17 Uhr
@Sai: Wenn dies Ihre spezielle Frage beantwortet hat, markieren Sie sie bitte als Antwort für diesen Thread. Die andere Antwort ist aus einem anderen Grund hilfreich, aber indem Sie dies als Antwort auf Ihr spezifisches Problem markieren, wird klargestellt, dass dieser Thread kein Duplikat des Threads ist, der mit der anderen Antwort verknüpft ist.
Es gibt verschiedene Fehlerzeichenfolgen, die von openssl ausgegeben werden, abhängig von den jeweiligen Versionen und Szenarien. Unten ist die Checkliste, die ich im Falle von Openssl-Problemen verwende:
Im Idealfall kann openssl nur mit demselben Schlüssel (+ Salt) und Enc-Algo verschlüsseln/entschlüsseln.
Stellen Sie sicher, dass die OpenSSL-Versionen (zum Verschlüsseln/Entschlüsseln) kompatibel sind. Für zB. Der in openssl verwendete Hash wurde in Version 1.1.0 von MD5 auf SHA256 geändert. Dies erzeugt einen anderen Schlüssel aus demselben Passwort. Behebung: fügen Sie „-md md5“ in 1.1.0 hinzu, um Daten aus niedrigeren Versionen zu entschlüsseln, und fügen Sie „-md sha256“ in niedrigeren Versionen hinzu, um Daten aus 1.1.0 zu entschlüsseln
Stellen Sie sicher, dass auf Ihrem Computer eine einzige Openssl-Version installiert ist. Falls mehrere Versionen gleichzeitig installiert sind (auf meinem Rechner waren diese installiert: „LibreSSL 2.6.5“ und „openssl 1.1.1d“), stellen Sie sicher, dass nur die gewünschte Version in Ihrer PATH-Variablen erscheint.
Diese Meldung kann auch auftreten, wenn Sie die angeben falsches Entschlüsselungskennwort (ja, lahm, aber nicht ganz offensichtlich, um dies aus der Fehlermeldung zu erkennen, oder?).
Ich habe die Befehlszeile verwendet, um die letzte Datenbanksicherung für mein Hilfstool zu entschlüsseln, und stand plötzlich vor diesem Problem.
Endlich, nach 10 Minuten Trauer und plus Lesen dieser Frage/Antworten, habe ich mich daran erinnert, dass das Passwort anders ist und alles mit dem richtigen Passwort gut funktioniert hat.
Das war mein Fall. Falsches Passwort!
– Obinna Nnenanya
28. April 2020 um 4:38 Uhr
Das ist auch mein Fall! Sollte auf jeden Fall das ERSTE sein, was man für dieses Problem überprüft!
– Benutzer1944491
13. Mai 2021 um 14:08 Uhr
Digvijay Chougale
In meinem Fall verschlüsselte der Server mit deaktiviertem Padding. Aber der Client hat versucht, mit aktiviertem Padding zu entschlüsseln.
Bei Verwendung von EVP_CIPHER* ist das Auffüllen standardmäßig aktiviert. Um explizit zu deaktivieren, müssen wir tun
EVP_CIPHER_CTX_set_padding(context, 0);
Nicht übereinstimmende Polsteroptionen können also ein Grund sein.
Das war mein Fall. Falsches Passwort!
– Obinna Nnenanya
28. April 2020 um 4:38 Uhr
Das ist auch mein Fall! Sollte auf jeden Fall das ERSTE sein, was man für dieses Problem überprüft!
– Benutzer1944491
13. Mai 2021 um 14:08 Uhr
Avinash
Sie sollten einen entschlüsselten privaten Schlüssel verwenden. Zum Beispiel: youprivatekey.decrypted.key. Sie können diesen Befehl ausführen, um Ihre private Schlüsseldatei zu entschlüsseln.
openssl rsa -in <encrypted_private.key> -out <decrypted_private.key>
Enter password:
Enter pass phrase for encrypted_private.key: <enter the password>
Wait:
writing RSA key
it's done...
14189800cookie-checkSo lösen Sie „EVP_DecryptFInal_ex: bad decrypt“ während der Dateientschlüsselungyes
Der CBC-Modus bietet nur Vertraulichkeit, und Sie müssen normalerweise einen MAC hinzufügen, um den CBC-Modus sicher zu verwenden. Sie sollten wahrscheinlich eine authentifizierte Verschlüsselung verwenden, da diese bereitgestellt wird beide Vertraulichkeit und Authentizität. Sehen EVP-authentifizierte Verschlüsselung und Entschlüsselung im OpenSSL-Wiki.
– jww
16. Dezember 2015 um 6:47 Uhr
Vereinfachen Sie Ihren Code. Verzichten Sie auf das Lesen des Dateisystems. Verschlüsseln Sie eine Datei und versuchen Sie, diese Datei zu entschlüsseln. Das Debuggen ist dann viel einfacher.
– adlag
16. Dezember 2015 um 11:37 Uhr
Danke für Ihre Antwort. Meinten Sie die Verwendung von Systemaufrufen aus dem Programm?
– Sai
17. Dezember 2015 um 6:16 Uhr