用python实现对称加密文件并解密
时间: 2024-01-31 08:02:48 浏览: 78
Python内置了一些加密模块,例如`cryptography`和`pycryptodome`等,可以用来实现对称加密文件并解密。
这里我们以`pycryptodome`为例,演示如何使用AES对称加密算法加密文件,并解密加密后的文件。
首先,你需要安装`pycryptodome`模块。你可以使用`pip`命令来进行安装:
```
pip install pycryptodome
```
然后,你可以使用以下代码来实现对称加密文件:
```python
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
# 定义加密函数
def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
# 如果没有指定输出文件名,则将输入文件名加上'.enc'后缀作为输出文件名
if not out_filename:
out_filename = in_filename + '.enc'
# 使用AES加密算法,ECB模式,PKCS7填充方式
cipher = AES.new(key, AES.MODE_ECB)
# 获取随机数作为IV向量
iv = get_random_bytes(AES.block_size)
# 打开输入文件和输出文件
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
# 先将IV向量写入输出文件
outfile.write(iv)
# 逐块读取输入文件,并加密后写入输出文件
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % AES.block_size != 0:
# 如果长度不是16的倍数,则使用PKCS7填充
chunk += b' ' * (AES.block_size - len(chunk) % AES.block_size)
outfile.write(cipher.encrypt(chunk))
# 定义解密函数
def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024):
# 如果没有指定输出文件名,则将输入文件名去掉'.enc'后缀作为输出文件名
if not out_filename:
out_filename = in_filename[:-4]
# 使用AES加密算法,ECB模式,PKCS7填充方式
cipher = AES.new(key, AES.MODE_ECB)
# 打开输入文件和输出文件
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
# 读取IV向量
iv = infile.read(AES.block_size)
# 逐块读取输入文件,并解密后写入输出文件
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
outfile.write(cipher.decrypt(chunk))
# 去掉PKCS7填充
outfile.truncate(outfile.tell() - ord(outfile.read()[-1]))
```
使用以上代码,你可以调用`encrypt_file()`函数来加密文件,调用`decrypt_file()`函数来解密加密后的文件。这里需要传入一个`key`参数,作为加密和解密的密钥。注意,密钥长度必须是16、24或32字节(即128、192或256位)。
例如,你可以这样来加密一个文件:
```python
key = b'your_secret_key' # 定义密钥
encrypt_file(key, 'plain_file.txt', 'encrypted_file.txt.enc') # 加密文件
```
然后,你可以这样来解密加密后的文件:
```python
key = b'your_secret_key' # 定义密钥
decrypt_file(key, 'encrypted_file.txt.enc', 'decrypted_file.txt') # 解密文件
```
以上代码中的加密算法使用了AES,ECB模式和PKCS7填充方式。在实际使用中,你应该根据自己的需求选择合适的加密算法、加密模式和填充方式。
阅读全文