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

时间:2018-11-02 22:49:24

标签: python encryption aes pycrypto encryption-symmetric

嘿,每个人我写的一些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'

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

2 个答案:

答案 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.