Autokey密码加密函数中if条件判断失效引发加密报错问题
问题分析与修复
核心问题
你的代码存在两个关键错误:
- 非互斥的条件判断:三个
if语句是独立执行的,而非互斥分支。比如处理小写字母时,第一个if执行后i自增,第二个if仍会触发检查,此时key[i]可能是小写字母,在大写字母列表alphau中查找就会抛出ValueError。 - 逻辑表达式错误:第三个
if的letter not in alphal or alphau写法错误,等价于(letter not in alphal) or True(非空列表在布尔判断中为真),导致该条件永远成立,会重复添加字符到加密结果。
修复后的代码
import string alphau = list(string.ascii_uppercase) alphal = list(string.ascii_lowercase) def encrypt(plaintext, key): enc = '' i = 0 key_len = len(key) # 记录密钥长度,用于循环复用 for letter in plaintext: if letter == ' ': enc += ' ' elif letter == '\n': enc += '\n' elif letter in alphal: # 处理小写字母,密钥字符转小写确保匹配 plain_idx = alphal.index(letter) key_idx = alphal.index(key[i % key_len].lower()) enc += alphal[(plain_idx + key_idx) % 26] i += 1 elif letter in alphau: # 处理大写字母,密钥字符转大写确保匹配 plain_idx = alphau.index(letter) key_idx = alphau.index(key[i % key_len].upper()) enc += alphau[(plain_idx + key_idx) % 26] i += 1 else: # 非字母字符直接保留 enc += letter return enc msg = encrypt("MyNameIsMhegazy", "jMiXMyNameIsMahm") print(msg)
额外优化点
- 添加了密钥的循环复用逻辑(
i % key_len),避免当明文长度超过密钥长度时索引越界。 - 对密钥字符做了大小写转换(
.lower()/.upper()),确保即使密钥大小写混合也能正确匹配字母列表,增强鲁棒性。
内容的提问来源于stack exchange,提问作者Mhegazy
相关产品推荐
相关产品推荐

