Почему я получаю разные результаты от python и php при шифровании строк AES-256?

Идея состоит в том, чтобы AES зашифровать строку и отправить ее на мой сервер, а затем расшифровать ее там, чтобы получить настоящую строку. Но это не сработало, и, как ни странно, я обнаружил, что результат отличается, даже когда вы шифруете строку AES-256 на python и php соответственно.

Пример Python:

from Crypto.Cipher import AES
import base64

original = "originalstring"
key = "12345678123456781234567812345678"
IV = "1234567812345678"

b64encodedOnly = base64.b64encode(original)

encryptCipher = AES.new(key, AES.MODE_CFB, IV)
encrypted = base64.b64encode(encryptCipher.encrypt(original))

decryptCipher = AES.new(key, AES.MODE_CFB, IV)
decrypted = decryptCipher.decrypt(base64.b64decode(encrypted))

print "original:", original
print "b64encoded only:", b64encodedOnly
print "AES-256 encrypted:", encrypted
print "AES-256 decrypted:", decrypted

Вывод Python:

original: originalstring
b64encoded only: b3JpZ2luYWxzdHJpbmc=
AES-256 encrypted: Rl4MMQojmBm0e6iuCl8=
AES-256 decrypted: originalstring

Пример PHP:

<?php
$original = "originalstring";
$key = "12345678123456781234567812345678";
$IV = "1234567812345678";

$b64encodedOnly = base64_encode($original);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $original, MCRYPT_MODE_CFB, $IV));
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encrypted), MCRYPT_MODE_CFB, $IV);

echo "original: " . $original . "<br />";
echo "b64encoded only: " . $b64encodedOnly . "<br />";
echo "AES-256 encrypted: " . $encrypted . "<br />";
echo "AES-256 decrypted: " . $decrypted . "<br />";

?>

Вывод PHP:

original: originalstring
b64encoded only: b3JpZ2luYWxzdHJpbmc=
AES-256 encrypted: +w9F6zLD2avTt9fj8aM=
AES-256 decrypted: originalstring

Как вы можете видеть, после шифрования AES-256 (режим CFB), а затем кодировки base64, "originalstring" превращается в "Rl4MMQojmBm0e6iuCl8=" на python, а "+w9F6zLD2avTt9fj8aM=" на PHP. Очевидно, что base64 работает одинаково, поскольку результат кодирования исходной строки одинаков, поэтому единственная проблема заключается в шифровании AES, я полагаю, что это один и тот же алгоритм, реализованный на другой платформе, почему результаты отличаются?

ИЗМЕНИТЬ:

Я обнаружил проблему: MCRYPT_RIJNDAEL_256 не эквивалентен AES_256.

Проверьте это: https://stackoverflow.com/a/17249813/402197


person Shane    schedule 06.12.2013    source источник
comment
@Xymostech Я думаю, что это скорее алгоритм, используемый двумя языками.   -  person aIKid    schedule 06.12.2013
comment
@Xymostech: Спасибо, что указали правильное направление!   -  person Shane    schedule 06.12.2013
comment
@aIKid: Оказалось, что MCRYPT_RIJNDAEL_256 и AES_256 не одно и то же.   -  person Shane    schedule 06.12.2013
comment
Ааа.. Разные алгоритмы?   -  person aIKid    schedule 06.12.2013
comment
@aIKid: Ну, небольшие отличия: stackoverflow.com/a/17249813/402197   -  person Shane    schedule 06.12.2013
comment
AES-256 по-прежнему RIJNDAEL-128. AES-256 использует 256-битный ключ и 128-битные блоки, RIJNDAEL-256 использует 256-битные блоки.   -  person CodesInChaos    schedule 06.12.2013
comment
Я также хочу отметить, что каждому сообщению нужен уникальный IV, что вы должны использовать MAC для предотвращения активных атак.   -  person CodesInChaos    schedule 06.12.2013