这道附件题目前只保留 samples.json,缺少完整题面。已经得到能满足所有方程的秘密向量与误差向量,但 masked_update 的生成规则不明,尚未得到最终 flag。不能把恢复私钥等同于完成整题。
附件结构
1 | q = 7681 |
数据满足 LWE 形式:b = A·s + e (mod q)。恢复出的 s 只有 0/1,e 取值为 -1、0、1。
求解思路
把 A 拆成上下两个 32×32 块 A1、A2,b 相应拆成 b1、b2。A1 在模 q 下可逆时:
1 | s = A1^-1 · (b1 - e1) mod q |
由此构造 64 维 q-ary 格,用 LLL、BKZ 约化,再通过 CVP 找到靠近目标的小误差。原会话在 WSL Kali 中使用 fpylll,求解脚本保留了 BKZ-20/30/40 的处理过程。
这解释的是已有求解脚本的构造,不代表只凭参数就能保证任意同维 LWE 都可这样高效求解。
已恢复并重新核验的结果
1 | s = 10000001000001100011101001110100 |
e 为 64 维三值向量,其中 42 个非零。整理本文时重新从 samples.json 和 lwe_solution.json 计算了全部 64 行残差:
1 | residuals = [ |
结果全部为零,且 s 的元素集合为 {0,1}、e 为 {-1,0,1}。这证明保存的解满足该实例;本文不据此声称解的唯一性已经被证明。
没完成的是 masked_update
1 | 7c53ddbd82faf811c0397982909a9498644d63fb50a6e697d7cf97f6 |
它有 28 字节,与 SHA-224 输出长度相同,但长度相同不能证明它就是 SHA-224 或某种哈希结果。
原会话和工作区尝试过多种候选:s/e 的直接字节或位串异或、常见哈希派生、不同大小端与序列化、若干 PRNG、AES 模式及流密码等。记录中没有得到符合预期格式且经平台确认的 flag。
这些失败只能排除具体脚本覆盖的候选,不能证明“所有常规方案都不可能”。也没有证据支持直接提交 flag{81063a74}。
自动扫 flag 的误报
自动接题器对 samples.zip 与 samples (1).zip 写入过一个含乱码、控制字符的 FrW{...} 候选。它来自附件静态扫描,没有数学推导或判题回执,不能算完成记录。两份样本应合并处理,避免把重复误报计作两道已解题。
后续应先补什么
先找原题名称、描述及生成脚本,确认 masked_update 的含义、字节编码和预期输出格式。保存的 s/e 已足够继续验证具体构造,不必先重跑格约化。
下面提供本题原始数据、已恢复的解以及独立校验脚本;它们只用于复核已完成的数学部分,不包含最终解密程序。
下载到同一目录后运行 python verify_solution.py。完整误差向量保存在解文件中。
资料来源
依据 10 月 31 日 samples 会话、samples_work/unz/solve_wsl.py、lwe_solution.json 及自动接题索引整理。本文重新执行了方程校验,没有重新运行格求解,也没有猜测最终 flag。
本文作者 Allureluoli
文字版权归作者所有,转载请注明出处;商业用途请先联系二月。