Функция шифрования и дешифрования Python дает мне ошибку Unicode - PullRequest
0 голосов
/ 27 сентября 2018

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

def generate_RSA():
    bits = 2048
    new_key = RSA.generate(bits)
    public_key = new_key.publickey()
    private_key = new_key
    return private_key, public_key

def encrypt_data(in_fd, chunk_size, pub_key):
    encryptor = PKCS1_OAEP.new(pub_key)
    A = list()
    with open(in_fd, 'rb') as in_file:
         while True:
               chunk = in_file.read(chunk_size)
               if len(chunk) == 0:
                  break
               elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - len(chunk) % 16)
               encrypted_file = encryptor.encrypt(chunk) 
    return encrypted_file

def decrypt_data(in_fd, chunk_size, priv_key):
    decryptor = PKCS1_OAEP.new(priv_key)
    with open(in_fd, 'rb') as in_file:
         while True:
               chunk = in_file.read(chunk_size)
               if len(chunk) == 0:
                  break
               decrypted_file = decryptor.decrypt(eval(str(chunk)))
    return decrypted_file

Я хотел иметь возможность вставлять encrypt_data и decrypt_data друг в друга в качестве первых аргументов, если это необходимо.Однако я сталкиваюсь с проблемой.

 priv_key, pub_key = generate_RSA()
 print(decrypt_data(encrypt_data('C:\\Users\cowbo\OneDrive\Documents\EWC\Haiku.txt', 8192, pub_key), 8192, priv_key))

Всякий раз, когда я пытаюсь запустить последнюю строку кода, я получаю следующую трассировку ...

  Traceback (most recent call last):
    File "C:\Users\cowbo\source\repos\Python Practice\PythonPractice\FileCounter.py", line 57, in <module>
       print(decrypt_data(encrypt_data('C:\\Users\cowbo\OneDrive\Documents\EWC\Haiku.txt', 8192, pub_key), 8192, priv_key))
    File "C:\Users\cowbo\source\repos\Python Practice\Python Practice\FileCounter.py", line 31, in decrypt_data
       with open(in_fd, 'rb') as in_file:
  UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 1: invalid start byte

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

1 Ответ

0 голосов
/ 27 сентября 2018

Вы передаете результат из encrypt_data() непосредственно в decrypt_data():

print(decrypt_data(encrypt_data(...))

encrypt_data() возвращает зашифрованные данные , а не имя файла:

       encrypted_file = encryptor.encrypt(chunk) 
return encrypted_file

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

decrypt_data() однако не принимает зашифрованные данные.Он принимает имя файла :

def decrypt_data(in_fd, chunk_size, priv_key):
    # ...
    with open(in_fd, 'rb') as in_file:

Сначала меня поразило то, что на любом компьютере, кроме Windows , выдаст ошибку «файл не найден»,но в Windows двоичное значение для пути к файлу сначала будет декодировано как UTF-8, а для зашифрованных данных произойдет сбой.

Чтобы исправить это, у вас есть три варианта:

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

  2. Создайте файл для зашифрованных данных. Зашифрованные данные возвращаются функцией шифрования в тот момент, когда вы вызываете функцию шифрования.Не передавайте результат напрямую в функцию дешифрования, передайте имя файла.

  3. Измените функцию дешифрования, чтобы принимать данные напрямую, а не читать их из файла.

В качестве примечания, в функции расшифровки вы используете:

decryptor.decrypt(eval(str(chunk)))

Это ... довольно странный способ передачи chunk непосредственно в расшифровкуфункция.Этого достаточно:

decryptor.decrypt(chunk)

chunk - это объект bytes, str(bytesvalue) дает вам "b'...'" (где b' в начале и ' в конце теперь являются частьюстрока) и eval() снова дает вам исходный bytesvalue.Просто передайте оригинал, нет необходимости тратить время на циклы.

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