Воссоздание команды расшифровки openssl в PyCrypto - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь воссоздать вторую команду (расшифровку) в PyCrypto

openssl enc -aes-128-ecb -nosalt -base64 -pass pass:abcde -md sha256 -in test.txt -out out.txt
openssl enc -d -aes-128-ecb -nosalt -base64 -pass pass:abcde -md sha256 -in out.txt

Содержимое test.txt равно flag{flagflag}. Вывод шифрования: 0KSF5koIceXxszsgzpl4uA==.

binascii.a2b_base64(b'0KSF5koIceXxszsgzpl4uA==') создает тот же байтовый массив, что и openssl enc -aes-128-ecb -nosalt -pass pass:abcde -md sha256 -in test.txt -out out.txt (без -base64), поэтому я знаю, что декодирование base64 должно быть первым шагом.

p = "abcde".encode()
h = SHA256.new(p)
key = h.hexdigest()[:32].upper()

key соответствует следующему выводу, поэтому я знаю, что код генерации ключа правильный:

$ openssl enc -aes-128-ecb -nosalt -pass pass:abcde -base64 -md sha256 -in test.txt -v -P
key=36BBE50ED96841D10443BCB670D6554F
bufsize=8192

Однако, если все это собрать вместе, в msg получается мусор. Любой указатель, в котором я ошибся, будет оценен.

from Crypto.Hash import SHA256
from Crypto.Cipher import AES

import binascii

c = binascii.a2b_base64(b'0KSF5koIceXxszsgzpl4uA==')

p = "abcde".encode()
h = SHA256.new(p)
key = h.hexdigest()[:32].upper()

cipher = AES.new(key.encode(), AES.MODE_ECB)
msg = cipher.decrypt(m)
print(msg)

1 Ответ

1 голос
/ 29 февраля 2020

Я обнаружил проблему: неправильная кодировка ключа: это не кодировка key в utf8 для получения bytearray, она должна обрабатывать key как шестнадцатеричное число и декодировать его в bytearray.

cipher = AES.new(bytearray.fromhex(key), AES.MODE_ECB)
msg = cipher.decrypt(m)
print(msg)
...