Python M2Crypto的AES 128加密与PHP的Mcrypt不同

时间:2012-08-05 21:01:20

标签: python django m2crypto

这是我的Python代码,我可以使用M2Crypto成功加密和解密:

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,但它似乎不会影响密码。

2 个答案:

答案 0 :(得分:1)

您的PHP $iv似乎是一个ASCII零的字符串(所以,字节0x30),在python iv中您似乎使用文字0x00字节

修改

您似乎也在通过b64encodeb64decode传递密文。你确定这些是完全相反的吗?没有换行符,格式化,尾随新行等?

答案 1 :(得分:0)

快速谷歌搜索显示以下代码段:http://www.example-code.com/python/crypt2_aes_matchPhp.asp

也许值得一试?