這裏是我的Python代碼,我可以成功地加密和利用解密M2Crypto:Python的M2Crypto的AES 128加密不同,PHP的這個Mcrypt
from base64 import b64encode, b64decode
import M2Crypto
class AESEncryptionService(object):
def encrypt(self, key, msg):
return self.__cipher(key, msg, 1)
def decrypt(self, key, msg):
try:
decrypted = self.__cipher(key, msg, 0)
return decrypted
except:
return False
def __cipher(self, key, msg, op):
iv = '\0' * 16
iv.encode('ascii')
cipher = M2Crypto.EVP.Cipher(alg='aes_128_cbc', key=key, iv=iv, op=op)
v = cipher.update(msg)
v = v + cipher.final()
del cipher
return v
enc_service = AESEncryptionService()
cipher = b64encode(enc_service.encrypt("FD496E240E7822552BC0D63C03AB7ABB", "Hello Hello Hello Hello Hello Hello Hello"))
print cipher
plaintext = enc_service.decrypt("FD496E240E7822552BC0D63C03AB7ABB", b64decode(cipher))
print plaintext
輸出:
oMkdgXOy49VvvbQksxuhBq3YqJWrEw++lZO3ZMYYyo6T7JpK+Ovp+tdm+FrVGPnN
Hello Hello Hello Hello Hello Hello Hello
我寫了一個簡單的測試腳本在PHP中希望得到相同的結果:
<?php
$key = 'FD496E240E7822552BC0D63C03AB7ABB';
$plain = 'Hello Hello Hello Hello Hello Hello Hello';
$iv = '0000000000000000';
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plain, MCRYPT_MODE_CBC, $iv);
$plain = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $cipher, MCRYPT_MODE_CBC, $iv);
echo base64_encode($cipher), '<br>';
echo $plain;
輸出:
v5QinnNaEkn8myZa31Ikl5DrrtSXrhebDERJz4uqUgWMvbZ3datyCbm9WHPGlAo7
Hello Hello Hello Hello Hello Hello Hello
你能幫我修復Python代碼來輸出與PHP相同的代碼嗎?我知道PHP的AES實現是正確的,因爲我可以在.NET中解密它。由M2Crypto Python庫輸出的字符串不能在.NET中解密。
我認爲這可能與填充有關。
M2Crypto.EVP.Cipher有填充參數。我曾嘗試將它設置爲1,2,3,128,但它似乎不影響密碼。
我試着改變它。然後Python生成仍然不同的vC1aH7bRFYdiBIUrqKCAwaqiWr1iB7zOuA2LTF6/dKBiA0nOq/lSseD8fNg90PsV。 – 2012-08-05 21:21:53
非常感謝。我已經修復了iv以及刪除了以64爲基礎對密鑰進行解碼的行。現在它輸出WBIvyV6Q/ceRP8YRkkSqeJ0q196xRMnS7Jn/3yg4F5uxPcxb6/o + J37prXQ + HdYt - 仍然不同。 – 2012-08-05 21:28:15
現在我得到了oMkdgXOy49VvvbQksxuhBq3YqJWrEw ++ lZO3ZMYYyo6T7JpK + Ovp + tdm + FrVGPnN - 有沒有其他想法?還有什麼不同呢? – 2012-08-05 22:34:22