1 Вопрос: Python шифрует большой файл

вопрос создан в Mon, Mar 18, 2019 12:00 AM

Этот скрипт - функция xor encrypt, если шифрование небольшого файла - это хорошо, но я попытался открыть зашифрованную информацию об ошибке большого файла (около 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()
    
0
  1. Не вызывайте XOR шифрование . В лучшем случае это запутывание.
    2019-03-18 11: 24: 49Z
  2. Помимо выбора шифра, вы захотите прочитать данные из исходного файла, кратные размеру блока вашего шифра, и записать зашифрованный блок обратно в цикл.
    2019-03-18 11: 28: 48Z
    1 ответ                              1                         

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

    С любым производственным шифром (), вам также необходимо иметь дело с заполнением выходного файла, если исходные данные не кратны размеру блока шифра. Этот скрипт не имеет с этим дело, отсюда и утверждение о размере блока.

    Кроме того, мы больше необратимо (ну, кроме того факта, что шифр 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)
    
        
    0
    2019-03-18 11: 38: 11Z
источник размещен Вот