Mcrypt durch OpenSSL ersetzen
Problem: Migration einer Anwendung von der Verwendung von Mcrypt zu OpenSSL zur Datenverschlüsselung. Der Verschlüsselungscode ist Blowfish und der Modus ist Electronic Code Book (ECB). Die Ausgabe der Openssl_encrypt- und Openssl_decrypt-Funktionen unterscheidet sich jedoch von den MCrypt-Gegenstücken, obwohl sie dieselben Parameter haben.
Ursache:
Die Diskrepanz ergibt sich aus den unterschiedlichen Auffüllalgorithmen, die von verwendet werden Mcrypt und OpenSSL. Mcrypt verwendet PKCS#5-Auffüllung, während OpenSSL PKCS#7-Auffüllung verwendet. PKCS#7-Auffüllung erfordert mindestens 1 Byte Auffüllung, während PKCS#5-Auffüllung eine Auffüllungslänge von 0 Byte zulässt. Darüber hinaus erfordert Mcrypt einen Initialisierungsvektor (IV) für den ECB-Modus, obwohl IV für den ECB-Modus nicht erforderlich ist.
Lösung:
Um das Problem zu beheben, entweder Füllen Sie die Eingabedaten manuell mit Auffüllung im PKCS#7-Stil auf, bevor Sie MCrypt-Funktionen verwenden, oder verschlüsseln Sie die Daten erneut mit dem richtigen Auffüllalgorithmus.
Hier ist eine modifizierte Version des in der Frage bereitgestellten Codes, die PKCS#7-Auffüllung für MCrypt verwendet:
$key = "anotherpassword1"; $str = "does it work 12"; $enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB); $dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB); echo(bin2hex($enc).PHP_EOL); var_dump($dec); $enc = openssl_encrypt($str, 'bf-ecb', $key, true); $dec = openssl_decrypt($enc, 'bf-ecb', $key, true); echo(bin2hex($enc).PHP_EOL); var_dump($dec);
Durch Hinzufügen von 1 Byte Auffüllung zu den Eingabedaten vor der MCrypt-Verschlüsselung funktionieren die Ausgaben sowohl von Mcrypt als auch von OpenSSL wird passen. Beachten Sie, dass für den ECB-Modus kein IV erforderlich ist und es auch nicht erforderlich ist, einen bereitzustellen.
Das obige ist der detaillierte Inhalt vonWarum liefern Mcrypt und OpenSSL unterschiedliche Verschlüsselungsergebnisse für Blowfish-ECB?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!