You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:54:16