如何使用Python加密文件

2023-03-26 00:00:00 python 如何使用 加密文件

要使用Python加密文件,可以使用加密算法和密钥对文件进行加密。常见的加密算法有AES、DES、RSA等。下面是使用AES算法和密钥对文件进行加密的示例:

import os
from Crypto.Cipher import AES

# 定义加密函数
def encrypt_file(key, filename):
    # 加密文件的块大小
    chunksize = 64*1024

    # 生成随机的IV向量
    iv = os.urandom(16)

    # 创建AES加密器
    encryptor = AES.new(key, AES.MODE_CBC, iv)

    # 获取文件大小
    filesize = os.path.getsize(filename)

    # 输出加密文件名和加密前文件大小
    encrypted_filename = filename + '.enc'
    print(f'Encrypting {filename} ({filesize} bytes) to {encrypted_filename}...')

    # 打开加密后文件并写入IV向量
    with open(encrypted_filename, 'wb') as outfile:
        outfile.write(iv)

        # 加密文件内容
        with open(filename, 'rb') as infile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    # 填充数据
                    chunk += b' ' * (16 - len(chunk) % 16)
                outfile.write(encryptor.encrypt(chunk))

# 密钥,必须为16、24、32字节长
key = b'mysecretpassword12'

# 要加密的文件
filename = 'pidancode.com'

# 加密文件
encrypt_file(key, filename)

这段代码会生成一个新的加密文件pidancode.com.enc,并将加密后的数据写入其中。解密时需要使用相同的密钥和IV向量。

# 定义解密函数
def decrypt_file(key, filename):
    # 加密文件的块大小
    chunksize = 64*1024

    # 打开加密文件并读取IV向量
    with open(filename, 'rb') as infile:
        iv = infile.read(16)

        # 创建AES解密器
        decryptor = AES.new(key, AES.MODE_CBC, iv)

        # 输出解密文件名
        decrypted_filename = os.path.splitext(filename)[0]
        print(f'Decrypting {filename} to {decrypted_filename}...')

        # 解密文件内容
        with open(decrypted_filename, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                outfile.write(decryptor.decrypt(chunk))

            # 去掉填充数据
            outfile.truncate()

# 解密文件
decrypt_file(key, 'pidancode.com.enc')

这段代码会生成一个新的解密文件pidancode.com,并将解密后的数据写入其中。解密前需要先将加密文件和密钥放在同一目录下。

需要注意的是,这段代码中使用的密钥为明文,实际使用时应该使用安全的方式保存密钥,例如使用密钥管理系统或硬件安全模块。

相关文章