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

Python 如何将字节解码为第一个正斜杠?,python,encryption,aes,pycrypto,encryption-symmetric,Python,Encryption,Aes,Pycrypto,Encryption Symmetric,大家好,我写的一些python AES解密代码有点问题。我正在尝试使用PyCryptome和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("mybase64k

大家好,我写的一些python AES解密代码有点问题。我正在尝试使用PyCryptome和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,这阻止了我获得填充长度,因为在所有情况下都是相同的

使用

为两封电子邮件返回相同的长度值。但是,当我打印数据时,我可以看到两封电子邮件,如下所示:

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\x08\x08y\xg3?\xa0\x1e\xaa`\xc2\x67\xf1i]3\xe1\xa0F'

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

我真的不知道
\x06
\x08
mean或signify,但它们恰好都不是可打印字符(这就是它们以十六进制显示的原因)。此外,为这两封电子邮件显示的值不是有效的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'

问题是您忘记取消加载,这是您的问题

取决于你如何填充

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

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

您是如何加密的?您所说的“第一斜杠”是指显示为两封电子邮件内容的
\x06
\x08
中的前导\吗?它们都不包含斜杠(或反斜杠,如果您真正的意思是这样的话)字符…这两项是以十六进制格式显示的单字节/字符。我在任何地方都看不到
/
。@kelalaka通过Laravel Crypt::EncryptString方法打开SSL,但它只使用普通的OpenSSLIt sems。加密前填充密文。解密后取消填充(对于CBC和ECB)
unpad(padded_data, block_size, style='pkcs7')
Remove standard padding.