嘿,每个人我写的一些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.com\x06\x06\x06\x06\x06\x06\x0f\xef\xe2\xa3\xdd\xH9\x7f\xj4\xwf\x14\x88\xd8(x\x90N'
b'abcd.efghi@myydomain.com\x08\x08\x08\x08\x08\x08\x08\x08y\xg3?\xa0\x1e\xaa`\xc2\x67\xf1i]3\xe1\xa0F'
如何在不知道原始文本长度的情况下,只获取字节数组中可以看到的字符串?有解决方法吗?我提供的两个示例字节数组具有相同的电子邮件长度/格式,只是不确定如何处理此问题。
答案 0 :(得分:1)
我真的不知道\x06
或\x08
的含义或含义,但是它们都碰巧不是可打印字符(这就是为什么它们以十六进制显示)的原因。此外,您为这两封电子邮件显示的值不是有效的Python语法。
忽略该问题,可以遵循以下方法进行操作:
import string
# Leaving the invalid '\xH9\x7f\xj4\xwf\x14\x88\xd8(x\x90N' part off.
email1 = b'abcdefghijklmnop@gmail.com\x06\x06\x06\x06\x06\x06\x0f\xef\xe2\xa3\xdd'
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'
答案 1 :(得分:1)
问题在于您忘记了取消垫合,这就是您的问题。
取决于您的填充方式;
pad(data_to_pad, block_size, style='pkcs7')
Apply standard padding.
反方向展开;
unpad(padded_data, block_size, style='pkcs7')
Remove standard padding.