Python仿射密码(Affine Cipher)GUI程序多字符加密报错求助
解决仿射密码多字符加密报错的问题
嘿,我来帮你搞定这个多字符加密的问题!你现在的代码核心问题是把整个输入字符串当成单个元素去字母表里找索引——比如输入"DE"时,程序会去string.ascii_uppercase里找"DE"这个字符串,当然找不到,所以才会报"不在列表中"的错误。
问题拆解
看你原函数里的这行:
input_index = alphabet.index(No_Diacritic)
这里的No_Diacritic是整个输入文本(比如"DE"),而alphabet里只有单个大写字母,自然匹配失败。要处理多字符,必须逐个遍历输入的每个字符,分别加密后再拼接结果。
另外你的代码还有两个小bug:
- 变量名拼写错误:
Encyption应该是Encryption - 函数参数
input被覆盖成了self.User_Input.upper(),其实应该使用传入的参数,避免混淆
修改后的加密函数
下面是修复后的代码,我加上了详细的注释:
import string import unidecode def Encrypt_Input(self, input_text, key_a, key_b): # 统一处理输入:转大写 + 去除重音符号 processed_text = input_text.upper() processed_text = unidecode.unidecode(processed_text) # 定义大写字母表 alphabet = list(string.ascii_uppercase) encrypted_chars = [] # 遍历每个字符,逐个加密 for char in processed_text: # 只处理字母字符,非字母直接保留(比如空格、数字) if char in alphabet: # 获取当前字符在字母表中的索引 char_index = alphabet.index(char) # 仿射加密核心公式 encrypted_index = ((int(key_a) * char_index) + int(key_b)) % 26 # 根据加密后的索引获取对应字母 encrypted_char = alphabet[encrypted_index] encrypted_chars.append(encrypted_char) else: # 非字母字符原样加入结果 encrypted_chars.append(char) # 将加密后的字符列表拼接成字符串 encrypted_result = ''.join(encrypted_chars) print(encrypted_result) return encrypted_result
关键改进点
- 逐个字符处理:用
for char in processed_text遍历输入的每个字符,不管输入是单字符还是长文本都能正常处理 - 非字母兼容:加入了
if char in alphabet的判断,避免用户输入空格、数字或符号时报错,同时保留这些字符(你可以根据需求改成过滤或其他处理) - 变量名规范:把容易混淆的
input参数改成input_text,修正了拼写错误 - 结果拼接:用列表收集每个加密后的字符,最后用
join拼接成字符串,比逐个字符串拼接效率更高
测试验证
比如你测试的例子:密钥a=1、b=3,输入"DE"
- D的索引是3,加密后:
(1*3 +3) %26 =6→ 对应字母G - E的索引是4,加密后:
(1*4 +3) %26=7→ 对应字母H
最终输出就是GH,完全符合预期。
额外提示
仿射密码的密钥a需要满足与26互质(即最大公约数为1),不然无法唯一解密。你可以在程序里加个验证逻辑,比如检查用户输入的a是否是[1,3,5,7,9,11,15,17,19,21,23,25]中的值,避免无效输入。
内容的提问来源于stack exchange,提问作者David Strnadel
相关产品推荐
相关产品推荐

