Herausfinden des genauen Schlüssels, der mit PHPs mcrypt erstellt wurde
Eine von mir verwaltete PHP-Anwendung verwendet Rijndael_256 mit EBC_MODE-Verschlüsselung mit mcrypt. Es macht Spaß, dass der Schlüssel nicht 256 Bit lang ist, sondern nur 160 Bitmcrypt_encrypt
Dokumentation Der Schlüssel wird mit \ 0 aufgefüllt, um die erforderliche Größe zu erhalten, wenn er zu klein ist.
Der Schlüssel, mit dem die Daten verschlüsselt werden. Wenn es kleiner als die erforderliche Schlüsselgröße ist, wird es mit '\ 0' aufgefüllt. Es ist besser, keine ASCII-Zeichenfolgen für Schlüssel zu verwenden.
Dies scheint um den Anfang von zu geschehenZeile 1186 in mcrypt.c und Ändern des Schlüssels in Zeile 1213.
Nehmen wir also an, wir haben$key = 'abcdefghijkm';
Das ist zu kurz, aber die PHP-Implementierung von mcrypt stellt sicher, dass es bei Verwendung von RIJNDAEL_256 auf 32 Zeichen (oder 256 Bit) erweitert wird. Wie sieht der endgültige Schlüssel aus?
Ich frage dies, weil eine andere Anwendung erstellt wird, die dieselben verschlüsselten Daten verwendet, aber in einer anderen Sprache vorliegt. Perl um genau zu sein und ich benutzeCrypto::Rijndael
. Welchen genauen Schlüssel müsste ich für den angegebenen Beispielschlüssel füttern?Crypto::Rijndael
(oder sonst was) um die Daten wieder entschlüsseln zu können?
Aktualisieren
Mit Perl kann ich einen Schlüssel generieren, der \ 0 gepolstert istpack('a32', 'my secret key');
(oderZ32
),length()
wird berichten 32 und dieCrypt::Rijndael
Modul akzeptiert den Schlüssel. Wenn man sich die Quelle von PHPs mcrypt ansieht, sollte dies der Schlüssel sein, der generiert wird (\ 0 aufgefüllt), aber er wird es einfach nicht brauchen.
In der Theorie in PHPpack('a32', 'my secret key');
sollte zu demselben mit \ 0 aufgefüllten Schlüssel führen, den PHPs mcrypt generiert, aber das ist nicht der Fall.
Ich bin sehr nah dran, einfach alles wieder zu verschlüsseln, aber mit einem neuen Schlüssel. Das kostet zu viel Zeit.