Я хочу зашифровать файл с помощью простого AES-шифрования, вот мой исходный код python3.
import os, random, struct
from Crypto.Cipher import AES
def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
if not out_filename:
out_filename = in_filename + '.enc'
iv = os.urandom(16)
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
outfile.write(iv)
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += ' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk.decode('UTF-8','strict')))
Он отлично работает для некоторых файлов, обнаруживает информацию об ошибках для некоторых файлов, таких как:
encrypt_file ("qwertyqwertyqwer", '/tmp/test1', out_filename = None, chunksize = 64 * 1024)
Нет информации об ошибке, отлично работает.
encrypt_file ("qwertyqwertyqwer", '/tmp/test2', out_filename = None, chunksize = 64 * 1024)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 17, in encrypt_file
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 65534-65535: unexpected end of data
Как исправить мою функцию encrypt_file?
Сделайте так, как говорят tmadam
, чтобы исправить
outfile.write(encryptor.encrypt(chunk.decode('UTF-8','strict')))
как
outfile.write(encryptor.encrypt(chunk))
Попробовать с некоторым файлом.
encrypt_file("qwertyqwertyqwer",'/tmp/test' , out_filename=None, chunksize=64*1024)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 16, in encrypt_file
TypeError: can't concat bytes to str