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

How to decode bytes to first forward slash?

大家好,我写的 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())

这似乎只是一个填充问题,但我不确定如何获得正确的填充大小。两个 passwords/IV 的加密长度完全相同,所以

print(len(dataDict['value']))

为两封电子邮件打印 44,填充它为两封电子邮件打印 48,这使我无法获得填充长度,因为它在所有情况下都相同。

正在使用

print(len(data))

returns 两封电子邮件的长度值也相同。但是,当我只是打印数据时,我可以看到两封电子邮件:

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'

如何在不知道原文长度的情况下只获取字节数组中可以看到的字符串?有解决方法吗?我提供的两个示例字节数组具有完全相同的 length/format 电子邮件,只是不确定如何处理此问题。

我真的不知道 \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'

问题是你忘记了 unpad,那是你的问题。

取决于你填充的方式;

pad(data_to_pad, block_size, style='pkcs7')
Apply standard padding. 

反向取消填充;

unpad(padded_data, block_size, style='pkcs7')
Remove standard padding.