如何将字节解码为第一个正斜杠



大家好,我写的一些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'

在不知道原始文本长度的情况下,我如何在字节数组中获取可以看到的字符串?有变通办法吗?我提供的两个示例字节数组的电子邮件长度/格式完全相同,只是不确定如何处理这个问题。

我真的不知道x06x08是什么意思,但它们都不是可打印的字符(这就是为什么它们以十六进制显示的原因(。此外,您为这两封电子邮件显示的值不是有效的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.

最新更新