我有一个输入字符串,我用MySQL的AES_ENCRYPT
对它进行加密,然后用python(而不是MySQLAES_DECRYPT
)对其进行解密。我打印了一些解密字符串的测试:
print decrypt_string
print "%sxxx" % decrypt_string
print len(decrypt_string)
print self.toHex(decrypt_string)
当输入字符串长度为8时,即abcdefgh,测试输出将为:
^{pr2}$如果输入字符串长度为7,即abcdefg:
abcdefg
abcdefg xxx
16
0x610x620x630x640x650x660x670x90x90x90x90x90x90x90x90x9
我发现随着输入字符串长度的增加,结束字符逐渐减少。为什么会有区别?如果我使用PHP-AES-encrypt而不是MySQL-AES_-encrypt,那么结束字符将是0x00。我正在使用第三方python AES lib。在
您观察到的原因是AES是一种分组密码,它只能以128位(=16字节)的块加密数据。为此,它通常与操作模式(允许加密较大的数据段)和填充模式一起使用。看起来您的python解密函数执行解密,但不会撤消填充,从而得到这个结果。在
您使用的是PKCS#5填充,它将附加一些字节(至少一个),所有字节的值都与这个数字相同,因此最终长度是块长度的倍数。在
xxx
套印{xxx
出现在右边。在找到如何为解密函数提供正确的填充模式(它应该有这样一个选项),或者自己删除填充:检查解密字符串的最后一个字节,转换成一个数字(使用它的ASCII值),并从
decrypt_string
的末尾取那几个字节。您还应该检查这些值是否相同。 (在将输出解释为字符串之前,应先执行此操作,即应用UTF-8或ASCII之类的编码。)相关问题 更多 >
编程相关推荐