Python替换密码程序密钥导入导出功能开发求助
Python简单替换密码加密工具补全方案
你当前提交的代码本质是固定偏移的ROT13凯撒密码实现,未达到作业要求的简单替换密码标准,缺失密钥生成、导入导出、全字符集支持、持久化存储能力,以下是可直接落地的实现方案。
核心设计逻辑
简单替换密码的核心是明文字符集与密文字符集的一一随机映射,这套映射关系就是密钥:
- 明文字符集固定内置在程序中,覆盖大小写英文字母、数字、常用特殊字符、空格,满足作业字符覆盖要求
- 密文字符集是明文字符集随机打乱后的等长字符串,加密时按索引映射替换,解密时反向映射即可
- 密钥持久化仅需存储打乱后的密文字符串,文件体积小、跨设备导入方便,关闭程序后重新导入即可解密历史密文
分功能实现说明
1. 合规密钥生成
使用标准库random.shuffle打乱固定字符集生成密文映射表,无固定偏移、无固定种子,每次生成的密钥唯一性有保障。
import random import string import os # 固定明文字符集:大小写字母+数字+常用特殊字符+空格 PLAIN_CHARS = string.ascii_uppercase + string.ascii_lowercase + string.digits + "!@#$%^&*()_+-=[]{}|;':\",./<>? " def generate_key(): cipher_chars = list(PLAIN_CHARS) random.shuffle(cipher_chars) # 返回(明文表, 密文表)格式的可用密钥对 return (PLAIN_CHARS, ''.join(cipher_chars))
2. 密钥导出(持久化存储)
仅需将密文字符串写入本地文件即可,支持自定义保存路径,可使用.key作为专属后缀方便识别。
def export_key(cipher_chars, save_path): with open(save_path, 'w', encoding='utf-8') as f: f.write(cipher_chars) print(f"[+] 密钥已保存至:{os.path.abspath(save_path)}")
注意:密钥文件等同于解密权限,仅可通过安全渠道分发给需要解密内容的对接人员,符合报社场景的机密传输要求。
3. 密钥导入
读取本地密钥文件中的密文字符串,先做合法性校验(长度匹配、字符集无缺失),校验通过后和内置明文表配对为可用密钥。
def import_key(key_path): if not os.path.exists(key_path): print("[-] 密钥文件不存在,请检查路径") return None with open(key_path, 'r', encoding='utf-8') as f: cipher_chars = f.read().strip() # 校验密钥合法性,避免导入损坏/伪造文件 if len(cipher_chars) != len(PLAIN_CHARS) or set(cipher_chars) != set(PLAIN_CHARS): print("[-] 密钥格式非法,无法导入") return None print("[+] 密钥导入成功") return (PLAIN_CHARS, cipher_chars)
4. 加解密逻辑改造
替换原有固定偏移逻辑,改为基于密钥映射表的字符替换,不在支持范围内的字符直接保留,避免程序报错。
def encrypt(message, key): plain_chars, cipher_chars = key res = [] for c in message: if c in plain_chars: res.append(cipher_chars[plain_chars.index(c)]) else: res.append(c) return ''.join(res) def decrypt(cipher_text, key): plain_chars, cipher_chars = key res = [] for c in cipher_text: if c in cipher_chars: res.append(plain_chars[cipher_chars.index(c)]) else: res.append(c) return ''.join(res)
完整可运行主程序
替换原有递归调用的交互逻辑,改为菜单式循环,增加密钥状态校验,未加载密钥时禁止加解密操作:
def main(): current_key = None while True: print("\n===== 报社机密报道传输加密工具 =====") print("1. 生成新加密密钥") print("2. 导入本地密钥文件") print("3. 加密明文消息") print("4. 解密密文消息") print("5. 导出当前密钥到本地") print("6. 退出程序") choice = input("请输入功能对应编号:").strip() if choice == "1": current_key = generate_key() print("[+] 新密钥已生成,请及时导出备份") elif choice == "2": path = input("请输入密钥文件路径:").strip() loaded_key = import_key(path) if loaded_key: current_key = loaded_key elif choice == "3": if not current_key: print("[-] 请先生成或导入密钥后再操作") continue msg = input("请输入要加密的明文:") print(f"[+] 加密结果:{encrypt(msg, current_key)}") elif choice == "4": if not current_key: print("[-] 请先生成或导入密钥后再操作") continue cipher_text = input("请输入要解密的密文:") print(f"[+] 解密结果:{decrypt(cipher_text, current_key)}") elif choice == "5": if not current_key: print("[-] 当前无加载的密钥,无法导出") continue path = input("请输入密钥保存路径(如report.key):").strip() export_key(current_key[1], path) elif choice == "6": print("程序已退出") break else: print("[-] 输入无效,请重新选择") if __name__ == "__main__": main()
达标验证点
- 生成密钥后导出本地,关闭程序重开后导入对应密钥,可正常解密历史密文,满足持久化要求
- 支持字符覆盖大小写字母、数字、常用特殊字符、空格,符合作业的密钥覆盖要求
- 密钥为随机一一映射的简单替换密码,而非固定偏移的凯撒密码,符合算法要求
- 完整覆盖作业要求的5项核心功能,满足Pass4、Pass6的密钥导入导出评分项要求
内容的提问来源于stack exchange,提问作者Evan Brown
相关产品推荐
相关产品推荐

