Защо получавам различни резултати от 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