knapack问题
一、总论
背包密码,利用的是子集和问题的困难性
给定一个正整数集合
求子集的和使得
即使使用MIMT攻击,也只能降到
这道题中n=160,无法求解
但如果定义在超级递增序列上,也就是满足
如果
算法(贪心算法)
1 | for i in range(n, 0, -1): |
但显然,问题不会这么简单的,我们可能得到的是混淆版本的背包问题,这就需要用到格了
二、Merkle–Hellman加密
私钥就是前面提到的超递增序列
但是为了看起来不那么明显,我们需要进行混淆
我们考虑生成一个模数m,满足
公钥是
假设Bob要加密x,那么
三、使用lattice进行攻击
我们构造这样的格
显然t的长度是相当小的,使用LLL算法,t应该就是最小的基
于是就回复出x了
要记得考虑模
来一道题
1 | from random import * |
exp
1 | B = [] |
这里要注意,可能得到的向量是-t,比如这里我们得到的res[0]
1 | (1, -1, -1, 1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 0) |
倒二应该是-1,这里是1,所以我们都得取反
四、HGAME
1 | from Crypto.Util.number import * |
这里的p就是x,然后
这里
显然不行,这里A是64x4都不满秩,在想什么?
那只能造格了
1 | n = len(list[0]) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 infinite_blog!