Python AES解密字符串以不同的ch结尾

2024-04-29 11:48:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入字符串,我用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。在


Tags: 字符串selfstringlenmysql字符encryptaes
1条回答
网友
1楼 · 发布于 2024-04-29 11:48:30

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

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

  • 对于8字节字符串,需要附加8个字节,每个字节的值为8。ascii8是退格字符,它在终端中将光标向左移动一次(8次),导致xxx套印{}。在
  • 对于7字节字符串,需要附加9个字节,每个字节的值为9。这是一个水平制表器,使您的xxx出现在右边。在

找到如何为解密函数提供正确的填充模式(它应该有这样一个选项),或者自己删除填充:检查解密字符串的最后一个字节,转换成一个数字(使用它的ASCII值),并从decrypt_string的末尾取那几个字节。您还应该检查这些值是否相同。 (在将输出解释为字符串之前,应先执行此操作,即应用UTF-8或ASCII之类的编码。)

相关问题 更多 >