凯撒密码暴力破解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)
修复说明
- 将解密函数改为接受
key参数,避免重复编写字符遍历逻辑,代码更简洁易维护。 - 暴力破解函数用
for循环遍历1到26的密钥,每次调用解密函数后把结果存入列表,最后返回所有结果的拼接字符串。 - 增加
char in letters的判断,避免find返回-1导致的索引错误,同时保留无法识别的原字符。 - 删除冗余的负数判断,利用Python取模运算符的特性简化代码。
内容的提问来源于stack exchange,提问作者user21724968
相关产品推荐
相关产品推荐

