gpt4 book ai didi

Python AES解密具有不同字符的字符串结尾

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:58 24 4
gpt4 key购买 nike

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

最佳答案

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

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

  • 对于 8 字节字符串,需要附加 8 个字节,每个字节的值为 8。ASCII 8 是退格字符,在终端中它将光标向左移动一位(8 次),结果是 xxx 套印 abc
  • 对于 7 字节字符串,需要附加 9 个字节,每个字节值为 9。这是水平制表符,使您的 xxx 显示在右侧。

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

关于Python AES解密具有不同字符的字符串结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8102112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com