2012-08-05 54 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