You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autokey密码加密函数中if条件判断失效引发加密报错问题

问题分析与修复

核心问题

你的代码存在两个关键错误:

  1. 非互斥的条件判断:三个if语句是独立执行的,而非互斥分支。比如处理小写字母时,第一个if执行后i自增,第二个if仍会触发检查,此时key[i]可能是小写字母,在大写字母列表alphau中查找就会抛出ValueError。
  2. 逻辑表达式错误:第三个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:30:33