Python шифрует большой файл - PullRequest
0 голосов
/ 18 марта 2019

Этот скрипт - функция шифрования xor, если шифрование небольшого файла - это хорошо, но я пытался открыть шифрование большого файла (около 5 ГБ) с информацией об ошибке:

"OverflowError: размер не помещается в int" и открываются слишком медленно.

Любой может помочь мне оптимизировать мой сценарий, спасибо.

from Crypto.Cipher import XOR
import base64
import os
def encrypt():
enpath = "D:\\Software"
key = 'vinson'
for files in os.listdir(enpath):
    os.chdir(enpath)  
    with open(files,'rb') as r:
        print ("open success",files)
        data = r.read()
        print ("loading success",files)
        r.close()
        cipher = XOR.new(key)
        encoding = base64.b64encode(cipher.encrypt(data))
        with open(files,'wb+') as n:
            n.write(encoding)
            n.close()

1 Ответ

0 голосов
/ 18 марта 2019

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

С любым шифром производственного уровня (, который 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...