Python加密和解密功能给我一个Unicode错误

时间:2018-09-27 12:07:18

标签: python encryption unicode

这是我为正在编写的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

如果需要,我希望能够将crypto_data和crypto_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 :(得分:0)

您要将结果从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)

chunkbytes对象,str(bytesvalue)为您提供"b'...'"(其中b'开始,'结束字符串的一部分)和eval()再次为您提供原始的bytesvalue。只需将原件传递进去,而无需在那里浪费循环时间。