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

凯撒密码暴力破解Python代码故障求助:请排查错误原因

凯撒密码暴力破解函数的问题分析与修复

你写的暴力破解函数主要有三个核心问题,导致它无法正常输出所有可能的解密结果:

1. 仅返回最后一次移位的结果

bruteforce函数里,每次循环n都会重新初始化plaintext = [],循环结束后只返回最后一次循环生成的明文——也就是移位26次的结果(等同于未移位,因为26是字母表长度),前面25种移位的结果全部被丢弃。

2. 非字母字符处理逻辑有漏洞

当密文中出现不在letters里的字符(比如数字、特殊符号,哪怕用了upper(),仍可能存在无法匹配的字符),letters.find(i)会返回-1,代入(letters.find(i) - n) %26会得到错误索引,导致逻辑异常。另外原解密函数未转大写,但暴力破解里转了,逻辑不一致。

3. 冗余的负数判断

你写的if p <0完全多余,Python的取模运算符%会自动处理负数:比如(-1) %26结果是25,(-3)%26结果是23,不需要额外加26修正。


修复后的代码

重构代码复用解密逻辑,同时收集所有移位结果:

letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def decrypt(cipher: str, key: int):
    "用指定密钥解密凯撒密码文本"
    plaintext = []
    for char in cipher.upper():
        if char == "-":
            plaintext.append(" ")
        elif char in letters:
            idx = letters.find(char)
            # 直接用取模处理所有正负情况
            p = (idx - key) % 26
            plaintext.append(letters[p])
        else:
            # 保留无法识别的原字符(比如数字、符号)
            plaintext.append(char)
    return "".join(plaintext)

def bruteforce(cipher: str):
    "遍历所有可能的移位(1-26),返回所有解密结果"
    all_results = []
    # 用for循环替代while,逻辑更清晰
    for key in range(1, 27):
        current_plain = decrypt(cipher, key)
        all_results.append(f"移位{key}: {current_plain}")
    # 把所有结果用换行符拼接成字符串返回
    return "\n".join(all_results)

修复说明

  1. 将解密函数改为接受key参数,避免重复编写字符遍历逻辑,代码更简洁易维护。
  2. 暴力破解函数用for循环遍历1到26的密钥,每次调用解密函数后把结果存入列表,最后返回所有结果的拼接字符串。
  3. 增加char in letters的判断,避免find返回-1导致的索引错误,同时保留无法识别的原字符。
  4. 删除冗余的负数判断,利用Python取模运算符的特性简化代码。

内容的提问来源于stack exchange,提问作者user21724968

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:10:24