В продолжение моего комментария: вы не хотите читать файл в память сразу, а обрабатывать его небольшими блоками.
С любым шифром производственного уровня (, который XOR определенно не равен ), вам также придется иметь дело с заполнением выходного файла, если исходные данные не кратны размеру блока шифра. Этот скрипт не имеет с этим дело, отсюда и утверждение о размере блока.
Кроме того, мы больше необратимо (ну, кроме того факта, что шифр XOR на самом деле напрямую обратим) перезаписывают файлы их зашифрованными версиями. (Если вы хотите сделать это, лучше добавить код для удаления оригинала, а затем переименовать зашифрованный файл на его место. Таким образом, вы не получите полузаписанный, полушифрованный файл. )
Также я удалил бесполезную кодировку Base64.
Но - не используйте этот код для чего-либо серьезного. Пожалуйста, не надо. Друзья не друзья раскручивают свои собственные крипто.
from Crypto.Cipher import XOR
import os
def encrypt_file(cipher, source_file, dest_file):
# this toy script is unable to deal with padding issues,
# so we must have a cipher that doesn't require it:
assert cipher.block_size == 1
while True:
src_data = source_file.read(1048576) # 1 megabyte at a time
if not src_data: # ran out of data?
break
encrypted_data = cipher.encrypt(src_data)
dest_file.write(encrypted_data)
def insecurely_encrypt_directory(enpath, key):
for filename in os.listdir(enpath):
file_path = os.path.join(enpath, filename)
dest_path = file_path + ".encrypted"
with open(file_path, "rb") as source_file, open(dest_path, "wb") as dest_file:
cipher = XOR.new(key)
encrypt_file(cipher, source_file, dest_file)