from Crypto.Cipher import AES from hashlib import ...
创建于:2025年8月15日
使用 GPT-5 Thinking 回答 Chat01
创建于:2025年8月15日
使用 GPT-5 Thinking 回答 Chat01
from Crypto.Cipher import AES
from hashlib import md5
from params import vecs
from os import urandom
key = int("".join([vecs[int.from_bytes(urandom(2)) & 0xfff] for _ in range(50)]), 2)
print("🎁 :", [[nonce := int(urandom(50*2).hex(), 16), (bin(nonce & key).count("1")) % 2] for _ in range(600)])
print("🚩 :", AES.new(key=md5(str(key).encode()).digest(), nonce=b"Tiffany", mode=AES.MODE_CTR).encrypt(open("flag.txt", "rb").read()))
帮我解决这个问题
这是个经典的“线性代数/奇偶点积”型密码题。你拿到了 600 组样本
(nonce, parity)
,其中 parity = popcount(nonce & key) mod 2
。这等价于把未知密钥 key
的各位看成 GF(2)(模2)上的未知数,样本给出了 600 条线性方程。密钥是 50 位(二进制拼接 50 个 vecs[...]
的结果),所以只要把每个 nonce
的低 50 位展开成一行,和 parity
作为右端项,就能用高斯消元在 GF(2) 上直接解出整份密钥。拿到 key
(整数)后,按题面做 md5(str(key).encode())
得到 AES 密钥,再用 AES-CTR(nonce=b"Tiffany")
解密即可。
我已经把完整的可直接跑的解题脚本给你准备好了(包含:解析打印输出 → GF(2) 高斯消元求 50 位密钥 → 复现 AES-CTR 解密):
🎁 :
和 🚩 :
开头)复制保存到一个文件,比如 dump.txt
。bashpip install pycryptodome
bashpython solve_parity_aes_ctr.py dump.txt # 如果密钥位数不是 50,可在第二个参数指定位数,比如: # python solve_parity_aes_ctr.py dump.txt 50
脚本会:
🎁 : [[nonce, parity], ...]
中解析出 600 组样本;nonce
的低 50 位构造矩阵 A
,在 GF(2) 上做完全消元(RREF),直接读出每一位密钥;key
(整数),计算 md5(str(key))
作为 AES key;nonce=b"Tiffany"
做 AES-CTR 解出 🚩
对应明文,并打印出来。popcount(n & k) mod 2
就是向量点积 ⟨n, k⟩
在 GF(2) 上的结果;nonce
是 100 字节(800 位),但与 50 位密钥相与后只有低 50 位起作用;key
用十进制字符串喂给 MD5,这一点注意别写错(不是二进制串也不是 big-endian bytes)。如果你把 dump.txt
准备好了,按上面三步跑脚本就能直接把 flag 打出来。需要我帮你检查结果或把两行输出贴过来一起跑也行。