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

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

2023-8-13 15:09
5571

给了 184 个 3d5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">F2[x]/x5431\mathbb{F}_2[x]/x^{543} -1 上多项式集合 a62K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">poly_set={p1,..,p184}poly\_set = \{p_1,..,p_{184} \} ,一个编码后的多项式 b20K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">encoded_targetencoded\_target ,一个编码矩阵 64cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">MF2800×543M \in \mathbb{F}_2^{800 \times 543} 。需要求一个 184 比特秘密输入 secret 进行选择,使得:

首先注意到后半部分是一个编码问题,给定 171K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">vF2543,MF2800×543\vec v \in \mathbb{F}_2^{543},M \in \mathbb{F}_2^{800 \times 543} ,求一个向量 ab9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">x\vec x 使得 :

ed0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">Mx+e=vM \cdot \vec x + \vec e = \vec v

本质上就是 543 个变量,给了 800 个方程,但是这 800 个方程中存在至多 10 个错误的方程(实际上就是 10 个方程是错误的),我们需要找出错误的方程,并且恢复出编码前的向量 a21K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">x\vec x 。大概有两个思路:

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

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

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

KCTF{666aac797b125dbdcdfdd46ca066ced4ac1cc9f1824275}

  1. 用 secret 的 184 比特进行选择,使得 c1bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">i=0183poly_set[i]secret[i]=target\prod_{i = 0}^{183} poly\_set[i]^{secret[i]} = target
  2. 上述 target 转换为 d63K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">F2543\mathbb{F}_2^{543} 上向量 276K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">x\vec x
  3. 16eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">encoded_targetencoded\_target 转换为 4f0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">F2543\mathbb{F}_2^{543} 上向量 38aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">v\vec v
  4. 满足 :7aaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">(Mx)+v=e(M \cdot \vec x) + \vec v = \vec e
  5. 误差向量 4c6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">e\vec e 的汉明重量小于等于 10。
  1. 这个形式像 LWE ,可以考虑用格来解,构造格,用 BKZ 规约。
  2. Information Set Decode 问题, 这里使用 sage 的 Information Set Decode (ISD)板子来解
  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算法的速度。

[注意]看雪招聘,专注安全领域的专业人才平台!

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

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册