python加密大文件

Posted

技术标签:

【中文标题】python加密大文件【英文标题】:python encrypt big file 【发布时间】:2019-08-08 17:55:13 【问题描述】:

这个脚本是异或加密功能,如果加密小文件就好了,但是我试过打开加密一个大文件(大约5GB)的错误信息:

“溢出错误:大小不适合 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()

【问题讨论】:

不要调用XOR加密。充其量只是混淆。 除了密码选择之外,您还需要以密码块大小的倍数从源文件中读取数据,然后在循环中将加密块写回。 【参考方案1】:

扩展我的评论:您不想一次将文件全部读入内存,而是在更小的块中处理它。

对于任何生产级密码 (which XOR is definitely not),如果源数据不是密码块大小的倍数,您还需要处理填充输出文件。这个脚本不处理那个,因此关于块大小的断言。

此外,我们不再不可逆地(好吧,除了 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)

【讨论】:

以上是关于python加密大文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用公钥加密openssl中的大文件

如何在Laravel中加密大文件?

面试官:怎么设计大文件大数据场景下的传输加密方案?

使用 JAVA 使用 AES 加密大文件

RSA加密大文件

怎么样给python文件加密