首页
社区
课程
招聘
[原创][2023 KCTF 年度赛] 98k 提交题目
2023-8-13 15:09 4058

[原创][2023 KCTF 年度赛] 98k 提交题目

2023-8-13 15:09
4058

98k 战队提交题目

题目设置

给了 184 个 F2[x]/x5431\mathbb{F}_2[x]/x^{543} -1 上多项式集合 poly_set={p1,..,p184}poly\_set = \{p_1,..,p_{184} \} ,一个编码后的多项式 encoded_targetencoded\_target ,一个编码矩阵 MF2800×543M \in \mathbb{F}_2^{800 \times 543} 。需要求一个 184 比特秘密输入 secret 进行选择,使得:

  1. 用 secret 的 184 比特进行选择,使得 i=0183poly_set[i]secret[i]=target\prod_{i = 0}^{183} poly\_set[i]^{secret[i]} = target
  2. 上述 target 转换为 F2543\mathbb{F}_2^{543} 上向量 x\vec x
  3. encoded_targetencoded\_target 转换为 F2543\mathbb{F}_2^{543} 上向量 v\vec v
  4. 满足 :(Mx)+v=e(M \cdot \vec x) + \vec v = \vec e
  5. 误差向量 e\vec e 的汉明重量小于等于 10。

解码问题

首先注意到后半部分是一个编码问题,给定 vF2543,MF2800×543\vec v \in \mathbb{F}_2^{543},M \in \mathbb{F}_2^{800 \times 543} ,求一个向量 x\vec x 使得 :

Mx+e=vM \cdot \vec x + \vec e = \vec v

本质上就是 543 个变量,给了 800 个方程,但是这 800 个方程中存在至多 10 个错误的方程(实际上就是 10 个方程是错误的),我们需要找出错误的方程,并且恢复出编码前的向量 x\vec x 。大概有两个思路:

  1. 这个形式像 LWE ,可以考虑用格来解,构造格,用 BKZ 规约。
  2. Information Set Decode 问题, 这里使用 sage 的 Information Set Decode (ISD)板子来解

多项式子集积问题

多项式环 F2[x]/x5431\mathbb{F}_2[x]/x^{543} -1 ,这个模分解开大概是 x5431=(x+1)(x2+x+1)f1f2f3x^{543} - 1 = (x+1)(x^2 + x + 1)f_1f_2f_3,其中 f1,f2,f3f_1 , f_2, f_3 的都是 180 次的不可约多项式 。 因此这里考虑同态到伽罗瓦域上 ,就形成了三个 Polynomial Subset Product Product (PSPP),这三个 PSPP 所在的乘法群的阶都是 218012^{180} - 1 , 这个阶很光滑,所以可以求解离散对数(其他思路:能否通过 lift 提升到 (21801)3(2^{180} -1)^{3} ),转换到有限域上经典的子集和问题,估算一下单个背包密度:184/180>1184/180 > 1 ,因此一般的求解子集和的方法在这题是行不通的,不能在多项式时间规约出。

因此考虑三个 PSPP 实例,这是 Multiple Subset Sum Problem,构造一个接近 200 维的格:

用 BKZ 不断调整 block_size 即可,大概需要跑 5 min。

注意事项

  1. fplll存在bug,所以在跑exp的时候请如果在 “res = solve_multiple_ssp(subsets, targets, mods, Integer(20), range(Integer(20),Integer(100),Integer(4)))” 出现error,可以调整exp的,启用被注释的“M = M.BKZ(block_size = bs, proof = False, strategies = load_strategies_json(BKZ.DEFAULT_STRATEGY_PATH + BKZ.DEFAULT_STRATEGY))”并且注释上一行代码。
  2. 当blocksize = 52 时可以跳出来,循环是为了调整bkz算法的块大小。
  3. 推荐使用10.0以上版本的sage
  4. exp_opt.sage 是优化版本的exp,这是因为原始的BKZ算法的blocksize决定算法精度,数值越大则精度越高,所以本题目blocksize=56即可立刻跑出flag。同时M.BKZ 的 proof 设置为 False 也能加快BKZ算法的速度。

flag

KCTF{666aac797b125dbdcdfdd46ca066ced4ac1cc9f1824275}


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2023-9-26 12:04 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 32410
活跃值: (18725)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2023-8-27 15:57
2
0
第十题 精准攻击
游客
登录 | 注册 方可回帖
返回