Кодировать в Laravel, декодировать в Python - PullRequest
0 голосов
/ 04 октября 2018

Я использую метод Laravel encryptString для шифрования некоторых данных на моем веб-сайте.При этом используется 256-битное шифрование AES-CBC OpenSSL без какой-либо сериализации.Сейчас я пытаюсь расшифровать эти данные в Python, но я получаю ошибки о длине ключа и не могу понять, почему.

Example data to decrypt: eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==

Example Key to use for decryption (from laravel .env):
base64:/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK=

Я изменил эти значения так, что фактически расшифровывать с этими выигранными значениямине дает никаких реальных данных, просто подумал, что это будет хорошо, например.Затем я пытаюсь расшифровать эти данные в Python 3.7 с помощью:

import base64
from Crypto.Cipher import AES

def decrypt(enc, key):
    IV = 16 * '\x00'
    decobj = AES.new(key, AES.MODE_CBC, IV)
    data = decobj.decrypt(base64.b64decode(enc))
    print(str(data.decode()))

if __name__ == "__main__":
    key = b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK="
    decrypt("eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==", key)

И кажется, что это должно работать, но когда я запускаю его, я получаю ошибку: ValueError: Incorrect AES key length (60 bytes), поэтому я не уверен, что яя делаю неправильноЯ пробовал заполнять / выгружать данные / клавишу, но это, похоже, ничего не меняет.Мне интересно, получаю ли я неправильный ключ для расшифровки от Laravel, но из того, что я могу сказать в связанной документации, это должен быть просто APP_KEY в моем файле .env.

Если кто-нибудьможет помочь мне или указать мне правильное направление, это было бы удивительно!

Этот вопрос уникален для других подобных вопросов, потому что я пытаюсь выяснить, в первую очередь, получаю ли я правильный ключ AES от LaravelНа самом деле мне не слишком нужна помощь в расшифровке, я просто думаю, что получаю неправильный ключ от Laravel.

РЕДАКТИРОВАТЬ: Новый код, который, кажется, работает:

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

def decrypt(enc, key):
    IV = 16 * '\x00'.encode()
    decobj = AES.new(key, AES.MODE_CBC, IV)
    data = decobj.decrypt(pad(base64.b64decode(enc), 16))
    print(base64.b64decode(data))

if __name__ == "__main__":
    key = base64.b64decode(b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK=")
    decrypt("eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==", key)

Теперь оператор print печатает несколько байтов, но когда я запускаю .decode (), я получаю ошибку: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 0: invalid start byte и не могу понять, что мне нужно сделать, чтобы его можно было печатать в виде строки.

1 Ответ

0 голосов
/ 04 октября 2018

Вопрос : ... пытаюсь расшифровать эти данные в Python, но я получаю ошибки о длине ключа

Я могу использовать ваш key, вкод связанного ответа после выполнения .b64decode(....
Пример кода .encode(... и decode(... работает как точный.
Вывод : С вашим Ключом все в порядке!

key = b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK="
key = base64.b64decode(key)

Но с вашим кодом я получил Ошибка типа , относящуюся к параметру IV:

  expect_byte_string(iv)
File "/usr/local/lib/python3.4/dist-packages/Crypto/Util/_raw_api.py", line 172, in expect_byte_string
  TypeError: Only byte strings can be passed to C code

Исправлено с помощью IV = 16 * '\x00'.encode(), приводит к ValueError , связанному с enc:

  data = decobj.decrypt(base64.b64decode(enc))
File "/usr/local/lib/python3.4/dist-packages/Crypto/Cipher/_mode_cbc.py", line 209, in decrypt
  ValueError: Error 3 while decrypting in CBC mode

Это приводит к проблемам с github: 10

Ошибка 3 означает «ERR_NOT_ENOUGH_DATA»

В соответствии со связанной страницей GitHub, вам нужно перечитать документацию, о данных заполнения пока вы кодируете .


Рабочий пример от GitHub :

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

key = b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK="
key = base64.b64decode(key)

BLOCK_SIZE = 32
encryption_suite = AES.new(key, AES.MODE_CBC, b'This is an IV...')
cipher_text = encryption_suite.encrypt(pad(b'A really secret message...', BLOCK_SIZE))

decryption_suite = AES.new(key, AES.MODE_CBC, b'This is an IV...')
print(unpad(decryption_suite.decrypt(cipher_text), BLOCK_SIZE).decode())
>>> A really secret message...

Протестировано на Python: 3.4.2

...