Расшифруйте зашифрованный секрет с помощью PyCrypto AES & sha256 - PullRequest
0 голосов
/ 12 мая 2019

У меня есть зашифрованное сообщение в файле, зашифрованное с помощью следующего кода. Я написал функцию для расшифровки этого сообщения. Я знаю пароль, используемый для его шифрования.

Но я получил следующую ошибку:

python3 decrypt.py enim_msg.txt 
Traceback (most recent call last):
  File "decrypt.py", line 45, in <module>
    print(":: Decrypted: \n" + bytes.decode(decrypted))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 2: invalid start byte

Как я могу исправить эту проблему, пожалуйста? Моя функция расшифровки неверна?

Мой код:

Функция шифрования

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

def encrypt(key, filename):
    chunksize = 64*1024
    outputFile = "en" + filename
    filesize = str(os.path.getsize(filename)).zfill(16)
    IV = Random.new().read(16)

    encryptor = AES.new(key, AES.MODE_CBC, IV)

    with open(filename, 'rb') as infile:
        with open(outputFile, 'wb') as outfile:
            outfile.write(filesize.encode('utf-8'))
            outfile.write(IV)

            while True:
                chunk = infile.read(chunksize)

                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - (len(chunk) % 16))

                outfile.write(encryptor.encrypt(chunk))

def getKey(password):
    hasher = SHA256.new(password.encode('utf-8'))
    return hasher.digest()

Функция расшифровки, которую я написал

def decrypt(enc, password):
    #print(":: enc => " + enc)
    private_key = hashlib.sha256(password.encode("utf-8")).digest()
    iv = enc[:16]
    cipher = AES.new(private_key, AES.MODE_CBC, iv)

    return cipher.decrypt(enc[16:])

Как я называю эту функцию

password = "azerty123"
secret_file_path = sys.argv[1]

the_file = open(secret_file_path, "rb")
encrypted = the_file.read()
decrypted = decrypt(encrypted, password)
the_file.close()

print(":: Decrypted: \n" + bytes.decode(decrypted))

1 Ответ

0 голосов
/ 13 мая 2019

Функция bytes.decrypt () по умолчанию ожидает строку в кодировке UTF-8.Но не каждая последовательность байтов является допустимой последовательностью UTF-8.В вашем случае cipher.decrypt() (который может вернуть любую последовательность байтов) вернул последовательность байтов, которая не является допустимой последовательностью UTF-8.Таким образом, функция bytes.decode() вызвала ошибку.

Фактическая причина, по которой cipher.decrypt() вернула строку не-UTF-8, является ошибкой в ​​вашем коде:

Ваш зашифрованный формат файла содержит не-UTF-8 данных.Его формат выглядит следующим образом:

  • 16 байтов Информация о лене (незашифрованная, в кодировке UTF-8)
  • 16 байтов IV (незашифрованная, двоичная, т.е. не в кодировке UTF-8)
  • n байтов полезной нагрузки (в зашифрованном виде, в кодировке UTF-8)

Вы должны убедиться, что при дешифровании вы декодируете только те части вашего файла, которые закодированы в кодировке UTF-8.Кроме того, вы должны убедиться, что вы расшифровываете только зашифрованные части вашего файла (как указано в ваших комментариях)

...