2011-11-12 146 views
1

我有一个输入字符串,我用MySQL的AES_ENCRYPT加密它,然后用python(而不是mysql AES_DECRYPT)解密。我打印输出的解密的字符串的一些测试:Python AES解密字符串以不同字符结尾

print decrypt_string 
print "%sxxx" % decrypt_string 
print len(decrypt_string) 
print self.toHex(decrypt_string) 

当输入字符串的长度为8位,即ABCDEFGH,测试输出将是:

abcdefgh 
xxxdefgh 
16 
0x610x620x630x640x650x660x670x680x80x80x80x80x80x80x80x8 

如果输入字符串的长度是7,即ABCDEFG :

abcdefg         
abcdefg         xxx 
16 
0x610x620x630x640x650x660x670x90x90x90x90x90x90x90x90x9 

我发现结尾字符在输入字符串的长度增加的同时递减。为什么有差异?如果我使用PHP AES加密而不是MySQL AES_ENCRYPT,则结尾字符将为0x00。我正在使用第三方python AES lib

+1

尝试使用'm2secret'([pip install m2secret]([pip install m2secret])加密/解密密钥( http://www.heikkitoivonen.net/m2secret/)) – jfs

+1

我建议不要使用一个库,它说*我最近对Python感兴趣,需要一个“初学者”项目来让我熟悉这门语言的基础知识。为密码学目的。 –

回答

1

您观察的原因是AES是一种分组密码,它只能以128位(= 16字节)的数据块加密数据。为此,它通常使用一种操作模式(以允许加密较大的数据)和填充模式。它看起来像你的python解密函数解密,但不撤销填充,给你这个结果。

您正在使用PKCS#5填充,它将附加多个字节(至少一个),所有与该数字相同的值,因此最终长度是块长度的倍数。

  • 对于8字节的字符串,需要追加8个字节,每个值为8. ASCII 8是退格字符,在终端中将光标向左移动8次,在xxx上套印abc
  • 对于您的7字节字符串,需要附加9个字节,每个值为9.这是水平制表符,使您的xxx看起来相当靠右。

要么找出如何提供正确的填充模式到您的解密功能(它应该有这样一个选项),或自己取出填充:检查decrypt_string的最后一个字节,转换为数字(使用其ASCII值),然后从decrypt_string的末尾开始读取很多字节。你也应该检查这些都具有相同的价值。 (你应该先解释输出为字符串,即应用UTF-8或ASCII等编码)。