Vernam加密算法XOR逻辑异常问题排查求助
修复Vernam加密器中的XOR逻辑与缩进错误
核心错误分析
1. XOR逻辑判断错误
你的XOR条件(bin_text[j] != bin_cipher[j]) and ((bin_text[j] or bin_cipher[j]) == "1")存在关键问题:
- Python中所有非空字符串均被视为真值,所以
"0" or "1"会返回"0"(第一个真值),而非你预期的"1"。当bin_text[j]为"0"、bin_cipher[j]为"1"时,(bin_text[j] or bin_cipher[j]) == "1"的结果为False,导致整个条件不成立,错误输出"0"。 - XOR的本质是两个位不同则为1,相同则为0,完全不需要额外的
and判断,仅需判断两个位是否不等即可。
2. 循环缩进错误
你将二进制转Unicode的循环for i in range(len(bin_encrypt)):嵌套在了外层的字符处理循环中,这会导致每次处理一个新字符时,都把之前所有已处理的结果重复添加到encrypt_chars里,最终结果出现重复值。
修正后的代码
def binary(char: str): val = ord(char) return list(format(val, 'b').zfill(8)) def vernam(text: str, cipher: str): text_chars = list(text) cipher_chars = list(cipher) encrypt_chars = [] # 扩展密钥至与明文等长 while len(cipher_chars) < len(text_chars): cipher_chars.extend(list(cipher)) if len(cipher_chars) > len(text_chars): cipher_chars = cipher_chars[:len(text_chars)] bin_encrypt = [] for i in range(len(text_chars)): bin_text = binary(text_chars[i]) bin_cipher = binary(cipher_chars[i]) current_bin = [] for j in range(8): # 简化XOR判断:位不同则为1 if bin_text[j] != bin_cipher[j]: current_bin.append("1") else: current_bin.append("0") bin_encrypt.append(current_bin) # 将二进制转换为Unicode值 for bin_char in bin_encrypt: encrypt_chars.append(int(''.join(bin_char), 2)) print(encrypt_chars) # 测试用例 vernam('hello', 'hi')
修正说明
- XOR逻辑简化:直接通过
bin_text[j] != bin_cipher[j]判断,符合XOR核心规则,避免字符串布尔运算的误区。 - 密钥扩展优化:用
extend替代嵌套循环添加字符,用切片截断替代循环pop,代码更简洁高效。 - 缩进修正:将二进制转Unicode的循环移到外层字符处理循环之外,确保每个结果只被添加一次。
- 临时变量优化:新增
current_bin存储单个字符的XOR结果,提升代码可读性。
测试结果
运行修正后的代码,输入vernam('hello', 'hi'),输出为[0, 12, 4, 5, 7],与预期结果完全一致。
内容的提问来源于stack exchange,提问作者Christian Badcoe
相关产品推荐
相关产品推荐

