from Crypto.Cipher import AES from hashlib import ...
Tạo vào: 15 tháng 8, 2025
Trả lời bằng GPT-5 Thinking bởi Chat01
Tạo vào: 15 tháng 8, 2025
Trả lời bằng GPT-5 Thinking bởi 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 打出来。需要我帮你检查结果或把两行输出贴过来一起跑也行。