一、原理介绍
该程序使用了Fernet对称加密算法,它是基于AES的一种对称加密算法。在程序中,通过输入密码,将其转换为32字节的密钥,然后使用这个密钥来进行文件的加密和解密操作。Fernet算法提供了简单易用的加密方式,适合用于保护数据的传输和存储。
二、运用到《网络安全》的相关知识
- 密码学基础:使用了加密算法Fernet来对文件进行加密和解密操作。Fernet是基于对称密钥的加密算法,它提供了对称加密的功能,确保了数据在传输和存储过程中的安全性。
- 密码处理:代码中对输入的密码进行了长度检查,并且使用base64进行密钥的生成。这些操作都是密码学中常见的处理方式,以确保密码的有效性和安全性。
- 用户界面:通过Tkinter库创建了一个简单的图形用户界面(GUI),使得用户可以方便地选择要加密或解密的文件,并输入相应的密码。
- 异常处理:代码中包含了对加密和解密过程中可能出现的异常情况的处理,这是信息安全中重要的一部分,以确保系统的稳定性和安全性。
三、代码实现的界面:
(1)要加密的文件
(2)加解密程序界面
(3)输入密码并加密成功
(4)输入密钥,进行解密文档
四、合理化优化
考虑到输入密码时,128位密钥显然不符合显示使用的需要,程序使用了cryptography.fernet
库中的Fernet
类来进行文件的加密和解密操作。在生成密钥的过程中,确实需要输入一个足够长度的密码(至少8个字符),而不是直接使用128位密钥。
Fernet
类内部会根据输入的密码自动生成一个对应的128位密钥。这个过程涉及到密码的盐值(salt)和密钥派生函数(如PBKDF2)。具体来说,Fernet
类会将输入的密码与一个随机生成的盐值进行组合,然后通过密钥派生函数进行迭代计算,最终生成一个128位的密钥。
这种设计使得用户无需直接处理复杂的128位密钥,而是只需要记住一个相对简单、易于记忆的密码即可。同时,由于盐值的存在,即使相同的密码也会生成不同的密钥,增加了加密的安全性。
因此,虽然用户输入的密码可能较短,但通过Fernet
类的密钥生成过程,最终得到的密钥仍然是128位的,符合Fernet加密算法的要求。
五、代码演示
import tkinter as tk
from tkinter import ttk, filedialog
from cryptography.fernet import Fernet
import base64
# 加载加密密钥
def load_key(password):
#load_key 函数使用输入的密码生成了一个密钥,然后这个密钥被用于Fernet加密算法。无论你输入多长的密码,最终生成的密钥长度都是固定的,即128位(16字节),符合Fernet算法的要求。
key = base64.urlsafe_b64encode(password.ljust(32)[:32].encode())
return key
# 加密文件
def encrypt_file(file_path):
password = password_entry.get()
key = load_key(password)
fernet = Fernet(key)
with open(file_path, "rb") as file:
file_data = file.read()
encrypted_data = fernet