Как декодировать байты в первую косую черту? - PullRequest
0 голосов
/ 03 ноября 2018

Привет всем, у меня небольшая проблема с кодом Python AES Decryption, который я написал. Я пытаюсь расшифровать два разных письма (разной длины) с использованием шифрования 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 голосов
/ 03 ноября 2018

Проблема в том, что вы забыли разблокировать, это ваша проблема.

В зависимости от того, как вы дополняете;

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

Разблокируйте его обратно;

unpad(padded_data, block_size, style='pkcs7')
Remove standard padding.
0 голосов
/ 03 ноября 2018

Я действительно не знаю, что означают или обозначают \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'
...