如何让大小写字母在维吉尼亚密码中等效?Python实现问题
维吉尼亚密码大小写兼容问题修复
你的代码核心问题是未统一处理输入的大小写,直接使用字符原始ASCII值计算偏移,导致小写字母(ASCII值远高于大写)参与运算时结果完全偏离预期。要实现不管明文/关键词是大写、小写还是混合输入,都输出正确的大写密文,可按以下方式修改:
问题根源
- 小写字母的ASCII值(如
h=104)与大写字母(如H=72)差值达32,直接用ord(string[i])计算会导致基础偏移值错误 - 关键词的大小写同样会干扰偏移量(如
a=97,A=65,两者的字母位置差了32)
修复后的代码
def generateKey(string, key): key = list(key.upper()) # 统一将关键词转为大写 if len(string) == len(key): return("".join(key)) else: for i in range(len(string) - len(key)): key.append(key[i % len(key)]) return("".join(key)) def encryption(string, key): encrypt_text = [] for i in range(len(string)): # 明文字符转大写,计算其在字母表的索引(A=0) plain_pos = ord(string[i].upper()) - ord('A') # 关键词字符转大写,计算偏移量 key_pos = ord(key[i].upper()) - ord('A') # 计算加密后位置并转回大写字母 encrypted_pos = (plain_pos + key_pos) % 26 encrypt_text.append(chr(encrypted_pos + ord('A'))) return("".join(encrypt_text)) string = input("Enter the message: ") keyword = input("Enter the keyword: ") key = generateKey(string, keyword) encrypt_text = encryption(string, key) print("Encrypted message:", encrypt_text)
修改说明
generateKey函数中先将关键词转为大写,确保扩展后的关键词格式统一encryption函数中:- 对每个明文字符先转大写,再计算0-25的字母索引,消除输入大小写的影响
- 关键词字符同步转大写计算偏移量,避免小写关键词导致的错误
- 最终结果统一输出大写,匹配你期望的
HFNLP格式
测试验证:
- 输入
hello+ABC→ 输出HFNLP - 输入
Hello+abc→ 输出HFNLP - 输入
hello+abc→ 输出HFNLP
内容的提问来源于stack exchange,提问作者thiccdan69
相关产品推荐
相关产品推荐

