2012-08-05 58 views
0

這裏是我的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,但它似乎不影響密碼。

回答

1

你的PHP $iv似乎是其中的蟒蛇iv你似乎是使用文字0x00字節ASCII零(所以,字節0x30)的字符串。

編輯

也似乎傳遞密文通過b64encodeb64decode。你確定這些是確切的倒數?沒有換行符,格式化,尾隨新行等?

+0

我試着改變它。然後Python生成仍然不同的vC1aH7bRFYdiBIUrqKCAwaqiWr1iB7zOuA2LTF6/dKBiA0nOq/lSseD8fNg90PsV。 – 2012-08-05 21:21:53

+0

非常感謝。我已經修復了iv以及刪除了以64爲基礎對密鑰進行解碼的行。現在它輸出WBIvyV6Q/ceRP8YRkkSqeJ0q196xRMnS7Jn/3yg4F5uxPcxb6/o + J37prXQ + HdYt - 仍然不同。 – 2012-08-05 21:28:15

+0

現在我得到了oMkdgXOy49VvvbQksxuhBq3YqJWrEw ++ lZO3ZMYYyo6T7JpK + Ovp + tdm + FrVGPnN - 有沒有其他想法?還有什麼不同呢? – 2012-08-05 22:34:22