使用Cryptodome.Cipher.AES实现Python中的加密文件储存系统
发布时间:2024-01-13 03:46:40
在Python中,可以使用Cryptodome库的Cipher模块来实现对文件的加密和解密。Cryptodome是Python加密工具箱的一个强大分支,它提供了各种常见的加密算法,包括AES(Advanced Encryption Standard)。
下面是一个示例,演示了如何使用Cryptodome.Cipher.AES来实现简单的文件加密储存系统:
from Cryptodome.Cipher import AES
from Cryptodome.Random import get_random_bytes
def encrypt_file(filename, key):
# 读取文件内容
with open(filename, 'rb') as file:
plaintext = file.read()
# 生成随机的初始化向量
iv = get_random_bytes(AES.block_size)
# 创建AES加密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 使用加密器加密文件内容
ciphertext = cipher.encrypt(plaintext)
# 合并初始化向量和加密后的文件内容
encrypted_data = iv + ciphertext
# 将加密后的数据写入新文件
with open(filename + '.enc', 'wb') as file:
file.write(encrypted_data)
def decrypt_file(filename, key):
# 读取加密后的文件内容
with open(filename, 'rb') as file:
encrypted_data = file.read()
# 从加密数据中分离初始化向量和文件内容
iv = encrypted_data[:AES.block_size]
ciphertext = encrypted_data[AES.block_size:]
# 创建AES解密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 使用解密器解密文件内容
plaintext = cipher.decrypt(ciphertext)
# 将解密后的数据写入新文件
with open(filename[:-4], 'wb') as file:
file.write(plaintext)
# 示例使用
key = b'1234567890123456' # 密钥必须为16, 24或32字节长度
# 加密文件
encrypt_file('data.txt', key)
print('文件已加密')
# 解密文件
decrypt_file('data.txt.enc', key)
print('文件已解密')
在上面的示例中,encrypt_file函数接受一个文件名和一个密钥作为参数。它首先使用AES算法和密钥创建一个加密器。然后,它随机生成一个初始化向量(iv),并使用加密器将文件内容进行加密。最后,它将初始化向量和加密后的文件内容写入一个新的加密文件中。
decrypt_file函数则是解密文件的逆过程。它接受一个加密文件名和相应的密钥作为参数。它首先从加密文件中读取出加密后的数据,并将其分离为初始化向量和文件内容。然后,它使用AES算法和密钥创建一个解密器,并使用解密器将文件内容解密。最后,它将解密后的文件内容写入一个新的文件中。
在示例中,我们使用了AES.MODE_CBC模式来进行加密和解密。这种模式需要一个随机的初始化向量,它在加密和解密时都必须与密钥一起使用。示例中的密钥长度为16字节(128位),这是AES算法中最常用的密钥长度。请注意,加密后的文件将保存为原始文件名加上“.enc”后缀的新文件。
需要注意的是,上述示例仅演示了如何使用Cryptodome.Cipher.AES来实现文件加密储存系统,并没有考虑如何安全地保存密钥或如何处理加密和解密过程中的异常情况。在实际应用中,您可能还需要进行一些额外的处理来确保密钥和加密文件的安全性。
