【问题标题】:Python AES decrypt string end with different charPython AES解密字符串以不同的字符结尾
【发布时间】:2011-11-12 02:31:55
【问题描述】:

我有一个输入字符串,我使用 MySQL 的 AES_ENCRYPT 对其进行加密,然后使用 python(不是 mysql AES_DECRYPT)对其进行解密。我打印了一些解密字符串的测试:

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

【问题讨论】:

  • 尝试使用带有m2secret (pip install m2secret) 的密钥进行加密/解密
  • 我建议不要使用这样的库:我最近对 ​​Python 产生了兴趣,需要一个“初学者”项目来熟悉该语言的基础知识。目的。

标签: python char aes


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多