Pycrypto aes 256 Размер вектора инициализации - PullRequest
4 голосов
/ 01 декабря 2011

в данном случае у меня есть php-скрипт, использующий aes256, 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 Ответ

11 голосов
/ 02 декабря 2011

Ага!

Существует различие во мнениях, что означает «256».

AES имеет фиксированный размер блока 128 битов, поэтому «AES 256» означает 128-битные блоки,256-битный ключ , 14 раундов.

Однако Rijndael допускает изменение как размера ключа, так и размера блока.MCRYPT_RIJNDAEL_256 относится к Rijndael с размером блока , установленным в 256 (и я не знаю, сколько раундов).Так что это действительно занимает 32 байта IV.Ваш PHP-скрипт не с использованием AES 256.

Это подтверждается в https://bugs.php.net/bug.php?id=47125 - репортер считает это ошибкой в ​​PHP mcrypt, PHP считает это ошибкой в ​​libmcrypt, но это не ошибка, так как libmcrypt документирует, что означает MCRYPT_RIJNDAEL_256 (по крайней мере, справочная страница linux для mcrypt делает мой Google-fu, так и не удалось найти какую-либо фактическую документацию для libmcrypt).Это случается не так, как AES 256.

Итак, вы шифруете и дешифруете с помощью шифров, которые, хотя и связаны, могут быть совершенно другими.

Плохие новостив том, что в PyCrypto нет Crypto.Cipher.RIJNDAEL.Если вы можете передать 256-битный ключ в MCRYPT_RIJNDAEL_128 в сценарии PHP, то это будет AES 256 (спасибо Paŭlo).

...