You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

XOR加密字符串转密钥方法及Project Euler 59密码转二进制疑问

让我一步步帮你理清这两个问题,尤其是针对Project Euler第59题的场景:

1. XOR加密中字符串转加密密钥的通用流程

XOR加密(尤其是字节级场景)里,字符串转密钥的核心是逐字符映射为字节单位的编码值,流程通常是这样:

  • 把字符串中的每个字符转换为对应的编码值(绝大多数英文文本场景用ASCII码,比如你遇到的第59题,明文是标准英文,所有字符都在ASCII范围内)
  • 根据加密规则确定密钥的复用方式:如果密钥长度短于明文/密文长度,通常会循环重复密钥来匹配目标长度(比如3字母密钥就循环对第1、4、7...个字节用第一个密钥字符,第2、5、8...用第二个,以此类推)
  • 不需要把编码值拼接成大数字再转二进制,因为XOR是**逐字节(8位)**运算的,每个字节独立参与运算
2. Project Euler第59题的密钥转换正确方式

你的第一种思路是对的,第二种完全不符合题目的加密逻辑,原因如下:

  • 题目里的加密方式是单字节XOR循环加密:每个密文字节是明文字节和密钥中对应位置的字节(循环取)做XOR的结果。这里的"字节"就是单个字符的ASCII码(8位二进制)。
  • 如果你把三个字母的ASCII码拼接成一个十进制数再转二进制,得到的是一个24位的二进制数,这完全不是题目要求的密钥形式——题目要的是三个独立的8位字节,循环使用。

Python 3实现示例

假设你已经读取了题目中的密文(逗号分隔的整数列表),下面是密钥转换和解密的核心代码:

# 示例密文(实际替换成题目里的数字列表)
ciphertext = [65, 27, 9, 1, 4, 3, ...]
# 假设我们已经通过频率分析得到了密码(比如"god")
password = "god"
# 把密码转换为ASCII码列表,这就是我们的密钥
key = [ord(char) for char in password]

# 解密过程:循环使用密钥的每个字节
plaintext_chars = []
for idx, byte in enumerate(ciphertext):
    # 循环获取密钥中的对应字节:idx % 3 会生成0,1,2,0,1,2...的序列
    key_byte = key[idx % len(key)]
    # 执行XOR运算,转换为字符
    plain_char = chr(byte ^ key_byte)
    plaintext_chars.append(plain_char)

# 拼接成明文字符串
plaintext = ''.join(plaintext_chars)
print(plaintext)

额外小技巧(针对第59题破解)

因为明文是英文文本,空格(ASCII码32)的出现频率最高。你可以把密文分成三组:第1、4、7...个字节为一组,第2、5、8...为一组,第3、6、9...为一组。分别统计每组中出现次数最多的字节,这个字节和32做XOR,得到的就是密钥对应的字符——这是破解这道题最高效的方法。

内容的提问来源于stack exchange,提问作者DannyH

火山引擎 最新活动