4

これは、aes256 を使用している php スクリプトがある場合です。CBC キーと IV の両方のサイズは 32 バイト長です。

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)

そして私が得たエラー

<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コード

 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') );
  }

IVサイズを変更できません

私は Python にあまり詳しくないことに注意してください。1 つの appengine になるため、データを暗号化する方法が必要です。

4

1 に答える 1

11

あはは!

「256」が何を指しているのかという意見の違いがあります。

AESのブロックサイズは128ビットに固定されているため、「AES 256」は、128ビットブロック、256ビットキー、14ラウンドを意味します。

ただし、Rijndaelでは、キーサイズとブロックサイズの両方を変更できます。ブロックサイズMCRYPT_RIJNDAEL_256が256に設定されたRijndaelを指します(ラウンド数はわかりません)。したがって、実際には32バイトのIVが必要です。PHPスクリプトはAES256を使用していません

これはhttps://bugs.php.net/bug.php?id=47125で確認されています-レポーターはこれをPHPmcryptのバグと見なし、PHPはlibmcryptのバグと見なしますが、libmcryptはバグではないため、バグではありません。意味を文書化しMCRYPT_RIJNDAEL_256ます(少なくともmcryptのlinux manページはそうですが、私のGoogle-fuはlibmcryptの実際の文書を見つけることができませんでした)。そのことは、AES256が意味するものと同じではありません。

つまり、関連しているものの、完全に異なる可能性のある暗号を使用して暗号化と復号化を行っていることになります。

Crypto.Cipher.RIJNDAEL悪いニュースは、PyCryptoにがないように見えることです。PHPスクリプトで256ビットキーをMCRYPT_RIJNDAEL_128に渡すことができる場合、それはAES 256になります(Paŭloに感謝)。

于 2011-12-02T11:09:36.643 に答える