请求修复Caesar Cipher暴力破解函数的输出叠加问题
修复凯撒密码暴力破解函数的输出叠加问题
嘿,这个问题我太熟了——你的暴力破解函数之所以会出现输出叠加的问题,核心原因就是存储解密结果的变量没有在每次密钥循环时重置,而是一直在往同一个变量里追加内容!
问题根源分析
举个例子,假设你原来的函数是这样写的:
def brute(ciphertext): # 错误:在循环外初始化结果变量,导致每次循环都追加内容 full_result = "" for key in range(26): decrypted_chars = "" # 这里是你的解密逻辑... full_result += f"Key {key}: {decrypted_chars}\n" print(full_result)
这里的full_result是在所有密钥循环开始前就创建的,每尝试一个密钥,就把当前结果拼接到这个变量里。这样到密钥2的时候,full_result已经包含了密钥1的结果,自然会出现叠加的情况。
修复方案
解决方法很简单:要么每次循环都重新初始化当前密钥的解密结果变量,要么直接在每次循环结束后打印当前结果,不要先攒到一个大字符串里。
下面是两种修复后的代码示例:
方案1:直接打印每个密钥的结果(最直观)
def brute(ciphertext): for key in range(26): # 关键:把解密结果变量移到循环内部,每次密钥循环都重新创建 decrypted = "" for char in ciphertext: if char.isalpha(): shifted = ord(char) - key # 处理小写字母边界 if char.islower(): if shifted < ord('a'): shifted += 26 # 处理大写字母边界 else: if shifted < ord('A'): shifted += 26 decrypted += chr(shifted) else: # 非字母字符直接保留 decrypted += char # 直接打印当前密钥的结果,不会叠加 print(f"Key {key}: {decrypted}")
方案2:用列表收集结果后统一输出(适合需要后续处理的场景)
如果你需要把所有结果保存起来而不是直接打印,可以用列表存储每个密钥的结果,最后再拼接输出:
def brute(ciphertext): results = [] for key in range(26): decrypted = "" for char in ciphertext: # 解密逻辑和上面一致 if char.isalpha(): shifted = ord(char) - key if char.islower(): if shifted < ord('a'): shifted += 26 else: if shifted < ord('A'): shifted += 26 decrypted += chr(shifted) else: decrypted += char results.append(f"Key {key}: {decrypted}") # 用换行符拼接所有结果,一次性输出 print("\n".join(results))
效果验证
修复后,每个密钥对应的解密结果都会是独立的:
预期输出:
Key 1: hello world
Key 2: gdkkn vnqkc
...
而不会再出现类似Key 2: hello worldgdkkn vnqkc的叠加情况。
内容的提问来源于stack exchange,提问作者bangers123
相关产品推荐
相关产品推荐

