Frage

Hier ist der Fall, dass ich ein PHP -Skript habe, das AES256 verwendet, CBC, sowohl die Schlüssel- als auch die IV -Größe sind 32 Bytes lang

data= '123456789abcdef' 
from Crypto.Cipher import AES
a = AES.new('oqufXQ(?bc=6_hR2I3sMZChDpb6dDlw4',2,'fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA')
print a.encrypt(data)

Und der Fehler, den ich bekam

<type 'exceptions.ValueError'>: IV must be 16 bytes long
Traceback (most recent call last):
  File "/base/data/home/apps/s~xxxxxxx/1.155074369696961822/main.py", line 4, in <module>

PHP -Code, der funktioniert

 echo base64_encode(encrypt('0123456789abcdef'))  ;


 function encrypt($data)
  {
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_256 ,'oqufXQ(?bc=6_hR2I3sMZChDpb6dDlw4', $data , MCRYPT_MODE_CBC, utf8_encode('fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA') );
  }

Ich kann die IV -Größe nicht ändern

Beachten Sie, dass ich mit Python nicht sehr vertraut bin, nur eine Möglichkeit benötigt, Daten zu verschlüsseln, da es sich um eine Apfelgine handelt.

War es hilfreich?

Lösung

Aha!

Es gibt einen Meinungsunterschied, worauf sich der "256" bezieht.

AES hat eine feste Blockgröße von 128 Bits, also bedeutet "AES 256" 128 -Bit -Blöcke, 256 Bit Schlüssel, 14 Runden.

Rijndael ermöglicht jedoch, dass sowohl die Schlüsselgröße als auch die Blockgröße variieren. MCRYPT_RIJNDAEL_256 bezieht sich auf rijndael mit Block Größe Set auf 256 (und ich weiß nicht, wie viele Runden). Es braucht also tatsächlich ein 32 Byte IV. Ihr PHP -Skript ist nicht mit AES 256.

Dies wird in bestätigt https://bugs.php.net/bug.php?id=47125 - Der Reporter betrachtet es als Fehler in PHP McRypt, PHP betrachtet es als Fehler in libmcrypt, aber es ist kein Fehler, da libmcrypt dokumentiert, was MCRYPT_RIJNDAEL_256 Mittel (zumindest die Linux-Mann-Seite für McRypt. Dieses Ding ist nicht dasselbe wie das, was AES 256 bedeutet.

Sie verschlüsseln und entschlüsseln mit Chiffren, die zwar verwandt sind, aber genauso gut anders sein könnten.

Die schlechte Nachricht ist, dass es keine zu geben scheint Crypto.Cipher.RIJNDAEL in Pycrypto. Wenn Sie im PHP-Skript einen 256-Bit-Schlüssel an mcrypt_rijndael_128 übergeben können, wäre das AES 256 (danke Paŭlo).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top