knapack问题
一、总论
背包密码,利用的是子集和问题的困难性
给定一个正整数集合 以及整数
求子集的和使得 显然直接求解的时间复杂度是
即使使用MIMT攻击,也只能降到
这道题中n=160,无法求解
但如果定义在超级递增序列上,也就是满足 的序列,那么有 左边是一个跌进,求和得到 于是有 那这个性质就可以帮助解决背包问题了
如果 说明里肯定有否则前面的和肯定小于然后扣掉,继续往下 小于自然就是没有了
算法(贪心算法)
1 | |
但显然,问题不会这么简单的,我们可能得到的是混淆版本的背包问题,这就需要用到格了
二、Merkle–Hellman加密
私钥就是前面提到的超递增序列
但是为了看起来不那么明显,我们需要进行混淆
我们考虑生成一个模数m,满足 然后一个与m互质的乘数w,那么 这就实现了加密
公钥是构成的背包B以及m
假设Bob要加密x,那么 那其实我们只要知道w的逆元自然就破解了 注意到m显然大于所有之和,所以直接就是等于 这就变成S’和a的背包问题了
三、使用lattice进行攻击
我们构造这样的格 考虑线性组合 t显然是格中的向量,而且这里2x_1-1,2x2-1都是-1或者1
显然t的长度是相当小的,使用LLL算法,t应该就是最小的基
于是就回复出x了
要记得考虑模
来一道题
1 | |
exp
1 | |
这里要注意,可能得到的向量是-t,比如这里我们得到的res[0]
1 | |
倒二应该是-1,这里是1,所以我们都得取反
四、HGAME
1 | |
这里的p就是x,然后 这里没有模了,所以不需要p那一行
这里 好像直接求逆矩阵就行?
显然不行,这里A是64x4都不满秩,在想什么?
那只能造格了 先用一组看看,发现每组都不一样,于是四组一起上 这里必须用bkz,LLL精度不够
1 | |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 InfinitePwn's Blog!