3

次のようにPHPで暗号化されたデータがあります。

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET, $data, MCRYPT_MODE_CBC, $iv)

このデータを Python 3 アプリケーションで復号化する必要があります。PyCrypto を使用しようとしていますが、他のライブラリも使用できます。以下が機能することを期待しています。

decryptor = AES.new(key, mode, IV=IV)
plain = decryptor.decrypt(ciphertext)

私の初期化ベクトルは 32 バイトで、次の例外がスローされます。

ValueError: IV must be 16 bytes long

32 バイトの初期化ベクトルと 32 バイトのブロック サイズを使用するように PyCrypto を設定するにはどうすればよいですか? または、データの復号化に使用できる別のライブラリはありますか?

4

1 に答える 1

0

コメントのおかげで、適切なソリューションを実装しました。リンクされた重複した質問を変更rijndael.pyして、文字列ではなくバイトを受け入れるようにしました。次に、それを次のように使用して、32 バイトの初期化ベクトルで 32 バイトのブロックを復号化します。

from rijndael import rijndael

iv = b'myInitializationVectorfoobarfoob'
key = b'myKeyfoobarfoobarfoobarfoobarfoo'
text = b'myCipherTextFoobarfoobarfoobarfo'

r = rijndael(key, block_size=32)
plaintext = r.decrypt(text)
l = ''.join([chr(a ^ b) for a, b in zip(plaintext.encode('latin-1'), iv)])
print(l)

PyCrypto ではなくこれを使用する必要があるのは、libmcrypt がデータ ブロックのサイズを誤って設定し、初期化ベクトルのサイズがキーのサイズと等しくなるように設定するためだけであることに注意してください。私の知る限り、AES-Rijndael のデータ ブロック サイズは常に 128 ビットである必要があります。

于 2014-12-07T03:15:27.973 に答える