加密日记脚本(Python版)
简介使用Python实现的简单且安全的日记加密/解密脚本使用行业标准的AES加密算法通过密码保护你的.txt文件核心功能①加密将普通的.txt日记加密成.enc文件并自动删除原文件防止泄露②解密将.enc文件解密回.txt供你编辑一、准备环境安装Python环境安装加密库打开cmd输入命令pip install pycryptodome二、代码脚本将以下代码复制并保存为diary_lock.py放在你存放日记的文件夹里from Crypto.Cipher import AES from Crypto.Protocol.KDF import PBKDF2 from Crypto.Random import get_random_bytes from Crypto.Util.Padding import pad, unpad import os # 配置参数 SALT_SIZE 16 # 盐值大小 IV_SIZE 16 # AES 初始向量大小 KEY_SIZE 32 # AES-256 密钥大小 ITERATIONS 100000 # 密钥派生迭代次数 def get_key(password: bytes, salt: bytes) - bytes: 使用密码和盐值生成AES密钥 return PBKDF2(password, salt, dkLenKEY_SIZE, countITERATIONS) def encrypt_file(file_path: str, password: str): 加密文件 if not os.path.exists(file_path): print(f错误找不到文件 {file_path}) return # 读取原文件内容 with open(file_path, rb) as f: data f.read() # 生成随机盐值和IV salt get_random_bytes(SALT_SIZE) iv get_random_bytes(IV_SIZE) key get_key(password.encode(), salt) # 开始加密 cipher AES.new(key, AES.MODE_CBC, iv) encrypted_data cipher.encrypt(pad(data, AES.block_size)) # 将盐值、IV和密文写入新文件 encrypted_file_path file_path .enc with open(encrypted_file_path, wb) as f: f.write(salt iv encrypted_data) # 删除原文件为了安全 os.remove(file_path) print(f✅ 加密成功\n已创建: {encrypted_file_path}\n已删除原文件。) def decrypt_file(file_path: str, password: str): 解密文件 if not file_path.endswith(.enc): print(错误这不是一个加密文件 (.enc)) return if not os.path.exists(file_path): print(f错误找不到文件 {file_path}) return # 读取加密文件内容 with open(file_path, rb) as f: salt f.read(SALT_SIZE) iv f.read(IV_SIZE) encrypted_data f.read() key get_key(password.encode(), salt) try: # 开始解密 cipher AES.new(key, AES.MODE_CBC, iv) decrypted_data unpad(cipher.decrypt(encrypted_data), AES.block_size) except (ValueError, KeyError): print(❌ 解密失败密码错误或文件已损坏。) return # 写入解密后的文件 original_file_path file_path[:-4] # 去掉 .enc 后缀 with open(original_file_path, wb) as f: f.write(decrypted_data) # 删除加密文件 os.remove(file_path) print(f✅ 解密成功\n已恢复: {original_file_path}\n现在可以去编辑了。) def main(): print( 日记加密/解密工具 ) print(1. 加密日记 (.txt - .enc)) print(2. 解密日记 (.enc - .txt)) choice input(请输入选项 (1 或 2): ).strip() filename input(请输入文件名 (例如 my_diary.txt): ).strip() password input(请设置/输入密码: ).strip() if choice 1: encrypt_file(filename, password) elif choice 2: decrypt_file(filename, password) else: print(无效选项) if __name__ __main__: main()使用步骤场景 1写好日记后加密1.你先正常写日记保存为 my_diary.txt2.双击运行 diary_lock.py或者在 CMD 里运行 python diary_lock.py3.输入 1 选择加密4.输入文件名 my_diary.txt5.输入你的密码6.程序会生成 my_diary.txt.enc 并删除原来的 txt别人就算打开电脑也看不了场景 2想写新日记时解密1.运行 diary_lock.py2.输入 2 选择解密3.输入文件名 my_diary.txt.enc4.输入密码5.程序会还原 my_diary.txt你就可以打开继续写了写完记得重复 “场景 1” 再加密代码的详细注释# 第一部分导入必要的库 # Crypto 是 pycryptodome 库提供的加密工具箱 from Crypto.Cipher import AES # 导入 AES 对称加密算法核心 from Crypto.Protocol.KDF import PBKDF2 # 导入密钥派生函数将密码变成安全的密钥 from Crypto.Random import get_random_bytes # 生成密码学安全的随机数 from Crypto.Util.Padding import pad, unpad # 处理数据填充AES要求数据长度固定 import os # 用于操作文件删除、检查是否存在 # 第二部分配置加密参数密码学常识 SALT_SIZE 16 # 盐值Salt大小16字节。 # 作用防止黑客用“彩虹表”批量破解密码即使两个人密码一样生成的密钥也不同。 IV_SIZE 16 # 初始向量IV大小16字节AES块大小固定为16字节。 # 作用让相同的原文加密后产生不同的密文防止通过密文模式猜测原文。 KEY_SIZE 32 # 密钥大小32字节对应 AES-256。 # 说明16字节是AES-12824字节是AES-19232字节是AES-256目前最安全的规格之一。 ITERATIONS 100000 # 密钥派生迭代次数10万次。 # 作用让黑客暴力破解时计算变慢你自己用只慢一点点但黑客破解要慢几万倍。 # 第三部分核心工具函数 def get_key(password: bytes, salt: bytes) - bytes: 【功能】将用户输入的简单密码如 123456转换成安全的AES密钥。 【参数】 password: 用户输入的密码字节格式 salt: 随机盐值防止彩虹表攻击 【返回】 一个固定长度的、安全的AES密钥 # PBKDF2 算法通过反复哈希计算把简单密码“拉伸”成安全的密钥 return PBKDF2(password, salt, dkLenKEY_SIZE, countITERATIONS) # 第四部分加密逻辑 def encrypt_file(file_path: str, password: str): 【功能】加密指定的文件并删除原文件防止泄露。 【参数】 file_path: 要加密的文件路径如 my_diary.txt password: 用户设置的密码 # 1. 安全检查如果文件不存在直接报错退出 if not os.path.exists(file_path): print(f错误找不到文件 {file_path}) return # 2. 读取原文件内容 # rb 表示以“二进制只读”模式打开。 # 原因加密算法不区分文字还是图片只认 0 和 1 的字节流。 with open(file_path, rb) as f: data f.read() # 3. 生成随机“盐值”和“初始向量” # 这两个东西必须是随机的且不需要保密会直接存放在加密文件的开头。 salt get_random_bytes(SALT_SIZE) iv get_random_bytes(IV_SIZE) # 4. 生成真正的AES加密密钥 key get_key(password.encode(), salt) # password.encode() 把字符串密码转成字节 # 5. 初始化 AES 加密器 # MODE_CBC: 密码分组链接模式是一种常用且安全的加密模式。 cipher AES.new(key, AES.MODE_CBC, iv) # 6. 执行加密 # pad(data, ...): 数据填充。 # 原因AES 是“块加密”算法每次只能处理 16 字节的数据。如果你的数据最后不够 16 字节必须补齐。 encrypted_data cipher.encrypt(pad(data, AES.block_size)) # 7. 写入加密后的新文件 encrypted_file_path file_path .enc # 新文件加个 .enc 后缀表示加密 with open(encrypted_file_path, wb) as f: # 写入顺序很重要盐值(16字节) - IV(16字节) - 真正的密文 # 因为解密时必须先用盐值生成密钥用IV初始化解密器。 f.write(salt iv encrypted_data) # 8. 删除原文件安全措施 # 注意如果是非常重要的日记建议确认加密文件没问题后再手动删除这里为了方便直接自动删了。 os.remove(file_path) print(f✅ 加密成功\n已创建: {encrypted_file_path}\n已删除原文件。) # 第五部分解密逻辑加密的逆过程 def decrypt_file(file_path: str, password: str): 【功能】解密 .enc 文件恢复原文件并删除加密文件。 【参数】 file_path: 要解密的文件路径如 my_diary.txt.enc password: 用户输入的密码 # 1. 基础检查文件名必须以 .enc 结尾 if not file_path.endswith(.enc): print(错误这不是一个加密文件 (.enc)) return # 2. 基础检查文件必须存在 if not os.path.exists(file_path): print(f错误找不到文件 {file_path}) return # 3. 读取加密文件的内容 with open(file_path, rb) as f: # 按照加密时的顺序依次读取 salt f.read(SALT_SIZE) # 先读前16字节盐值 iv f.read(IV_SIZE) # 再读接下来的16字节初始向量 encrypted_data f.read() # 剩下的所有内容真正的密文 # 4. 生成密钥和加密时用的是同一个逻辑确保密钥一致 key get_key(password.encode(), salt) try: # 5. 初始化 AES 解密器 cipher AES.new(key, AES.MODE_CBC, iv) # 6. 执行解密 # unpad(...): 去掉加密时填充的多余字节恢复原始数据长度。 decrypted_data unpad(cipher.decrypt(encrypted_data), AES.block_size) except (ValueError, KeyError): # 如果报错通常是两个原因 # 1. 密码输错了KeyError # 2. 文件被篡改过或者盐值/IV损坏了ValueError print(❌ 解密失败密码错误或文件已损坏。) return # 7. 写入恢复后的原文件 original_file_path file_path[:-4] # 切片操作去掉文件名最后 4 个字符 .enc with open(original_file_path, wb) as f: f.write(decrypted_data) # 8. 删除加密文件 os.remove(file_path) print(f✅ 解密成功\n已恢复: {original_file_path}\n现在可以去编辑了。) # 第六部分用户交互界面 def main(): 【功能】主函数处理和用户的对话逻辑 print( 日记加密/解密工具 ) print(1. 加密日记 (.txt - .enc)) print(2. 解密日记 (.enc - .txt)) # 获取用户输入 choice input(请输入选项 (1 或 2): ).strip() # strip() 去掉用户不小心输入的空格 filename input(请输入文件名 (例如 my_diary.txt): ).strip() password input(请设置/输入密码: ).strip() # 根据用户选择执行不同功能 if choice 1: encrypt_file(filename, password) elif choice 2: decrypt_file(filename, password) else: print(无效选项) # 程序入口只有直接运行这个脚本时才会执行 main() if __name__ __main__: main()三、优势(1)支持跨平台即使换了电脑只要以下三样东西还在就能接着使用①你的 .enc 加密日记文件不能删改、损坏②正确的密码③同一份加密逻辑的 Python 代码就是现在这份(2)密码支持任意数字、字母、特殊字符但千万要牢记忘了谁都解不开