Python UnicodeDecodeError: код 'utf-8' c не может декодировать байт - PullRequest
1 голос
/ 14 февраля 2020

Во-первых, извините, у меня так много вопросов по этой проблеме, и я утонул во многих ответах, но я все еще не получил его, потому что мой код работает, только если я пишу в файл (?)

Итак, почему это работает:

# encrypt and write to file    
    data_to_encrypt = "mytext" 
    data = data_to_encrypt.encode('utf-8')
    ciphered_bytes = cipher_encrypt.encrypt(data)
    ciphered_data = ciphered_bytes
    print(ciphered_data)

    with open(fileConfigBIN, "wb") as binary_file:
        binary_file.write(ciphered_data)

# read the file and decrypt
    with open(fileConfigBIN, "rb") as binary_file:
        data1 = binary_file.read()
        print(data1)
        deciphered_bytes = cipher_decrypt.decrypt(data1)
        decrypted_data = deciphered_bytes.decode('utf-8')
        print(decrypted_data)

Вывод:

b '\ xa0U \ xee \ xda \ xa8R'

b ' \ xa0U \ xee \ xda \ xa8R '

mytext

Но просто комментируя запись в файл (файл все еще там с той же информацией):

    #data_to_encrypt = "mytext" 
    #data = data_to_encrypt.encode('utf-8')
    #ciphered_bytes = cipher_encrypt.encrypt(data)
    #ciphered_data = ciphered_bytes
    #print(ciphered_data)

    #with open(fileConfigBIN, "wb") as binary_file:
    #    binary_file.write(ciphered_data)

    with open(fileConfigBIN, "rb") as binary_file:
        data1 = binary_file.read()
        print(data1)
        deciphered_bytes = cipher_decrypt.decrypt(data1)
        decrypted_data = deciphered_bytes.decode('utf-8')
        print(decrypted_data)

Я получаю это:

b '\ xa0U \ xee \ xda \ xa8R'

Исключение в обратном вызове Tkinter (последний вызов в последний раз): Файл "C : \ Users ................... \ Python37-32 \ lib \ tkinter__init __. Py ", строка 1705, в вызов , возврат self.fun c (* args) Файл "C: \ Users \ Fabio \ source .............", строка 141, в AbrirConfig decrypted_data = deciphed_bytes.decode ('utf-8') UnicodeDecodeError: код «utf-8» c не может декодировать байт 0xdd в позиции 1: недопустимый байт продолжения

прочитанный код используется g тот же файл, что и закомментированная часть, сохраните его!

Я пытался сохранить и прочитать в 'latin-1', 'ISO-8859-1' и других .. он не дает ошибок, но возвращает просто странно символы

Использование Python 3.7

Спасибо заранее!

РЕДАКТИРОВАТЬ:

Полный рабочий минимальный код:

from Crypto.Cipher import AES

fileConfigBIN = "data.dat"

key = b'\x16\x18\xed\x1c^\xaaGN\rl\xc0]\xf0t=\xd0\xdc]t\xaf\xb2\x12,\xe6\xfc\xd6\x11-\x10\xb4\xb1\x0b'
cipher_encrypt = AES.new(key, AES.MODE_CFB)
iv = cipher_encrypt.iv
cipher_decrypt = AES.new(key, AES.MODE_CFB, iv=iv)

def Encrypt():
    data_to_encrypt = "MyTextToEncrypt" 
    data = data_to_encrypt.encode('utf-8')
    ciphered_bytes = cipher_encrypt.encrypt(data)
    ciphered_data = ciphered_bytes

    with open(fileConfigBIN, "wb") as binary_file:
        binary_file.write(ciphered_data)
        print("CRYPTED DATA SAVED TO FILE: ", str(ciphered_data))

def Decrypt():
    with open(fileConfigBIN, "rb") as binary_file:
        data1 = binary_file.read()
        print("DATA READ FROM FILE: ", data1)
        deciphered_bytes = cipher_decrypt.decrypt(data1)
        decrypted_data = deciphered_bytes.decode('utf-8')
        print("DECRYPTED DATA: ", decrypted_data)

Encrypt() #comment this function to show the problem
print('---------------------')
Decrypt()

Я сделал это, ребята! Благодаря @ Hoen ie insight для каждого шифрования я сохраняю значение iv и использую его для расшифровки при необходимости. Если случится необходимость зашифровать снова, это сохранит еще одно значение iv и так далее ... Спасибо, спасибо!

1 Ответ

0 голосов
/ 14 февраля 2020

Хорошо, похоже, это не имеет ничего общего с кодированием / декодированием. Вам необходимо создать новый объект шифрования, поскольку его можно использовать только один раз.

def Decrypt():
    cipher_decrypt = AES.new(key, AES.MODE_CFB, iv=iv)   # <-- add this
    with open(fileConfigBIN, "rb") as binary_file:
        data1 = binary_file.read()
        print("DATA READ FROM FILE: ", data1)
        deciphered_bytes = cipher_decrypt.decrypt(data1)
        decrypted_data = deciphered_bytes.decode('utf-8')
        print("DECRYPTED DATA: ", decrypted_data)

В исходном коде: GitHub

Объект шифрования с состоянием: после того, как вы расшифровали сообщение, вы не можете расшифровать (или зашифровать) другое сообщение с тем же объектом.

Спасибо: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...