大家好,我写的一些python AES解密代码有点问题。我正在尝试使用PyCryptoDome和AES-256-CBC加密来解密两封不同长度的电子邮件。我的代码如下:
import base64
from Crypto.Cipher import AES
import json
from Crypto.Util.Padding import pad, unpad
def decrypt(enc):
# Get key
key = base64.b64decode("mybase64key")
# Load dictionary of Base64 values of the payload to decrypt
dataDict = json.loads(base64.b64decode(myEncryptedData))
# Create decrypter with our IV
decrypter = AES.new(key, AES.MODE_CBC, base64.b64decode(dataDict['iv']))
# Pad and decode data
data = decrypter.decrypt(pad(base64.b64decode(dataDict['value']), 16))
# EDIT: PRINTING DATA HERE
print(data)
# Works for shorter password
print(data[:-24].decode())
# Works for longer password
print(data.decode())
这似乎只是一个填充问题,但我不知道如何获得正确的填充大小。两个密码/IV的加密长度完全相同,因此
print(len(dataDict['value']))
为两封电子邮件打印44,填充为两封邮件打印48,这使我无法获得填充长度,因为在所有情况下都是相同的。
使用
print(len(data))
同时为两封电子邮件返回相同的长度值。然而,当我只是打印数据时,我可以看到两封这样的电子邮件:
b'abcdefghijklmnop@gmail.comx06x06x06x06x06x06x0fxefxe2xa3xddxH9x7fxj4xwfx14x88xd8(xx90N'
b'abcd.efghi@myydomain.comx08x08x08x08x08x08x08x08yxg3?xa0x1exaa`xc2x67xf1i]3xe1xa0F'
在不知道原始文本长度的情况下,我如何在字节数组中获取可以看到的字符串?有变通办法吗?我提供的两个示例字节数组的电子邮件长度/格式完全相同,只是不确定如何处理这个问题。
我真的不知道x06
或x08
是什么意思,但它们都不是可打印的字符(这就是为什么它们以十六进制显示的原因(。此外,您为这两封电子邮件显示的值不是有效的Python语法。
忽略这个问题,沿着这些路线的东西可能会起作用:
import string
# Leaving the invalid 'xH9x7fxj4xwfx14x88xd8(xx90N' part off.
email1 = b'abcdefghijklmnop@gmail.comx06x06x06x06x06x06x0fxefxe2xa3xdd'
for i, value in enumerate(email1):
if chr(value) not in string.printable:
print(i, '\x{:02x}'.format(value))
print(email1[:i]) # Show everything up to that point.
break
else:
print('all values were printable')
输出:
26 x06
b'abcdefghijklmnop@gmail.com'
问题是您忘记了解包,这是您的问题。
取决于你的填充方式;
pad(data_to_pad, block_size, style='pkcs7')
Apply standard padding.
相反地解开;
unpad(padded_data, block_size, style='pkcs7')
Remove standard padding.