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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:55:21