ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Все приведенные здесь примеры небезопасны и не близки к тому, чтобы быть хорошей практикой. Используемый здесь код предназначен для использования в вызове CTF и содержит несколько уязвимостей.
Вот мое действительное беспокойство: результат шифрования с тем же ключом, iv, mode и padding с использованием mcrypt_encrypt приводит к другому шифру, чем при том же использовании Crypto.cipher AES в python 2.7, но только при использовании Режим OFB . Вот мой пример:
$key = 'SUPER_SECRET_KEY';
$iv = '0000000000000000';
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_OFB, $iv));
Результат: k8Ss4ytOUNvcG96tr+rHdA==
Теперь пример с питоном:
from Crypto.Cipher import AES
from base64 import b64encode
key = 'SUPER_SECRET_KEY'
iv = '0'*16
data = "this is a test"
padding = 16 - (len(data) % 16)
data += chr(padding)*padding
print(b64encode(AES.new(key, AES.MODE_OFB, iv).encrypt(data)))
Результат: kzFpEHCJB+2k2498DhyAMw==
Это происходит только в режиме OFB. Если бы я изменил режим на CBC (и больше ничего не изменил), оба результата были бы идентичны. Есть идеи, что происходит?
РЕДАКТИРОВАТЬ: использование openssl_encrypt в PHP дает мне те же результаты, что и код Python. Это наводит меня на мысль, что в mcrypt_encrypt есть ошибка.
$key = "SUPER_SECRET_KEY";
$iv = "0000000000000000";
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
$cipher = openssl_encrypt($data, "aes-128-ofb", $key, $options=OPENSSL_RAW_DATA, $iv);
echo base64_encode($cipher) ."\n";