Python 磁盘加密实现:完整指南及代码示例
对于机密数据,磁盘加密是一种非常重要的保护手段。Python 语言提供了丰富的加密库,可以用来实现磁盘加密。以下是使用 Python 实现磁盘加密的代码示例。
- 加密文件
import os
from cryptography.fernet import Fernet
def encrypt_file(filename, key):
with open(filename, 'rb') as f:
data = f.read()
fernet = Fernet(key)
encrypted = fernet.encrypt(data)
with open(filename, 'wb') as f:
f.write(encrypted)
if __name__ == '__main__':
key = Fernet.generate_key()
encrypt_file('test.txt', key)
这段代码使用了 cryptography 库中的 Fernet 算法来对一个文件进行加密。生成了一个随机的 key,用该 key 加密文件内容,并将加密后的内容写回到原文件中。
- 解密文件
import os
from cryptography.fernet import Fernet
def decrypt_file(filename, key):
with open(filename, 'rb') as f:
data = f.read()
fernet = Fernet(key)
decrypted = fernet.decrypt(data)
with open(filename, 'wb') as f:
f.write(decrypted)
if __name__ == '__main__':
key = b'...key...'
decrypt_file('test.txt', key)
这段代码使用了与加密相同的 key,对一个已经加密的文件进行解密。读取文件内容并使用 key 进行解密,将解密后的内容写回到原文件中。
- 递归加密/解密目录
import os
from cryptography.fernet import Fernet
def encrypt_directory(directory, key):
for root, dirs, files in os.walk(directory):
for file in files:
filename = os.path.join(root, file)
encrypt_file(filename, key)
def decrypt_directory(directory, key):
for root, dirs, files in os.walk(directory):
for file in files:
filename = os.path.join(root, file)
decrypt_file(filename, key)
if __name__ == '__main__':
key = Fernet.generate_key()
encrypt_directory('/path/to/directory', key)
这段代码可以递归地加密一个目录下的所有文件。使用 os.walk 函数遍历目录下的所有文件,并对每个文件进行加密操作。
- 集成加密/解密命令
import argparse
from cryptography.fernet import Fernet
def encrypt_file(filename, key):
with open(filename, 'rb') as f:
data = f.read()
fernet = Fernet(key)
encrypted = fernet.encrypt(data)
with open(filename, 'wb') as f:
f.write(encrypted)
def decrypt_file(filename, key):
with open(filename, 'rb') as f:
data = f.read()
fernet = Fernet(key)
decrypted = fernet.decrypt(data)
with open(filename, 'wb') as f:
f.write(decrypted)
def encrypt_directory(directory, key):
for root, dirs, files in os.walk(directory):
for file in files:
filename = os.path.join(root, file)
encrypt_file(filename, key)
def decrypt_directory(directory, key):
for root, dirs, files in os.walk(directory):
for file in files:
filename = os.path.join(root, file)
decrypt_file(filename, key)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Encrypt/decrypt a file or directory')
parser.add_argument('mode', choices=['encrypt', 'decrypt'], help='encrypt or decrypt')
parser.add_argument('path', help='file or directory path')
parser.add_argument('--key', help='encryption key')
args = parser.parse_args()
if args.key:
key = bytes(args.key, 'utf-8')
else:
key = Fernet.generate_key()
if os.path.isfile(args.path):
if args.mode == 'encrypt':
encrypt_file(args.path, key)
else:
decrypt_file(args.path, key)
else:
if args.mode == 'encrypt':
encrypt_directory(args.path, key)
else:
decrypt_directory(args.path, key)
这个代码将上述的加密/解密代码集成到一个命令行工具中。使用 argparse 库解析命令行参数,根据参数选择加密或解密,以及加密/解密的文件或目录路径。可以指定加密/解密的 key,如果不指定,则随机生成一个 key。
原文地址: https://www.cveoy.top/t/topic/lHdu 著作权归作者所有。请勿转载和采集!