Python简单仿射加密代码Bug排查:输入“A A A”输出异常
仿射加密空格与字母混淆Bug的解决
问题根源
你遇到的Bug大概率是字符遍历逻辑错误或者字母/非字母判断逻辑混乱导致的:
- 比如手动管理索引时,遇到空格错误地跳过了后续字符;
- 或者错误地将非字母字符的处理逻辑和字母处理绑定,导致空格后的字母被误判为非字母。
修正方案
采用逐个遍历字符的方式,明确区分字母与非字母:字母执行加密逻辑,非字母(包括空格)直接原样保留,无需额外特殊处理。
修正后的代码
def affine_encrypt(char, a, b): # 处理大写字母 if char.isupper(): base = ord('A') return chr((a * (ord(char) - base) + b) % 26 + base) # 处理小写字母 elif char.islower(): base = ord('a') return chr((a * (ord(char) - base) + b) % 26 + base) # 非字母直接返回(比如空格、标点) else: return char def encrypt_message(message, a, b): encrypted_chars = [] # 逐个遍历每个字符,不跳过任何元素 for char in message: encrypted_chars.append(affine_encrypt(char, a, b)) return ''.join(encrypted_chars) # 测试示例 if __name__ == "__main__": # a必须和26互质,这里选a=3,b=5(符合条件) print(encrypt_message("A A A", 3, 5)) # 输出应为加密后的字母+空格+加密后的字母+空格+加密后的字母,比如"F F F"
关键细节
- 用
for char in message遍历,避免手动操作索引导致的跳过错误; - 用
isupper()/islower()精准判断字母类型,非字母直接返回,确保空格等字符原样保留; - 仿射加密中
a必须与26互质(即gcd(a,26)=1),否则无法解密,这是仿射加密的核心要求。
内容的提问来源于stack exchange,提问作者Definitely-not-a-crooked monke
相关产品推荐
相关产品推荐

