凯撒密码(Caesar cipher)循环回绕功能实现求助
凯撒密码循环回绕问题求助
我的代码还有其他问题,但最头疼的是凯撒密码的循环回绕逻辑(比如从z回到a,Z回到A)。查了很多资料都没解决,以下是我的代码:
import string upper = string.ascii_uppercase lower = string.ascii_lowercase digit = string.digits letters = string.ascii_letters delrv = input("Vill du kryptera, skriv K. Vill du dekryptera, skriv D") inm = input("Skriv en text eller siffror") nyckel = (input("Ange nycklar")) lista = [] listad = [] splitNyckel = nyckel.split(" ") splitNyckel = [int(a) for a in splitNyckel] #kryptering if(delrv == "K" or delrv == "k"): for i in range(len(inm)): #for a in range(len(splitNyckel)): #rakning = ord(inm[i]) + 1 #if(rakning == 90): #elif(rakning == 122): if(ord(inm[i]) + splitNyckel[i] == 90): lista[i] = 65 elif(ord(inm[i]) + splitNyckel[i] == 122): lista[i] = 97 lista.append(ord(inm[i]) + splitNyckel[i]) print(chr(lista[i])) #Dekryptering if(delrv == "D" or delrv == "d"): for i in range(len(inm)): lista.append(ord(inm[i]) - splitNyckel[i]) print(chr(lista[i]))
问题分析与修复
原代码核心问题
- 循环回绕逻辑只处理了偏移后刚好等于Z(90)或z(122)的极端情况,偏移量更大时(比如y偏移2要变成a)完全失效
- 尝试直接修改
lista[i]时列表为空,会触发索引错误 - 未处理非字母数字字符(比如符号),偏移后会变成乱码
- 输入文本长度大于密钥列表长度时,会触发索引越界
修正后的代码
import string upper = string.ascii_uppercase lower = string.ascii_lowercase digit = string.digits # 获取用户输入(转为中文提示) action = input("加密请输入K,解密请输入D:").strip().lower() text = input("请输入文本或数字:") key_input = input("请输入密钥(空格分隔多个数字):") # 处理密钥:转为整数列表,长度不足时自动重复补全 keys = list(map(int, key_input.split())) if len(keys) < len(text): keys = (keys * (len(text) // len(keys) + 1))[:len(text)] result = [] if action == "k": # 加密逻辑 for char, key in zip(text, keys): if char in upper: # 大写字母循环偏移:基于索引取模26实现回绕 original_idx = upper.index(char) new_idx = (original_idx + key) % 26 result.append(upper[new_idx]) elif char in lower: # 小写字母同理 original_idx = lower.index(char) new_idx = (original_idx + key) % 26 result.append(lower[new_idx]) elif char in digit: # 数字循环偏移0-9 original_idx = digit.index(char) new_idx = (original_idx + key) % 10 result.append(digit[new_idx]) else: # 非字母数字直接保留 result.append(char) elif action == "d": # 解密逻辑:偏移量取反后取模 for char, key in zip(text, keys): if char in upper: original_idx = upper.index(char) new_idx = (original_idx - key) % 26 result.append(upper[new_idx]) elif char in lower: original_idx = lower.index(char) new_idx = (original_idx - key) % 26 result.append(lower[new_idx]) elif char in digit: original_idx = digit.index(char) new_idx = (original_idx - key) % 10 result.append(digit[new_idx]) else: result.append(char) else: print("输入无效,请输入K或D") exit() # 输出最终结果 print("处理后的文本:", "".join(result))
关键逻辑说明
- 用
(索引 + 偏移量) % 26处理字母循环:比如z的索引是25,偏移1时(25+1)%26=0,对应a,完美实现回绕 - 数字用
%10实现0-9的循环偏移 - 用
zip同时遍历文本和密钥,避免手动索引导致的错误 - 自动补全密钥长度,解决文本比密钥长的情况
- 保留非字母数字字符,提升代码鲁棒性
内容的提问来源于stack exchange,提问作者Noel G
相关产品推荐
相关产品推荐

