一、问题简述(引自杨波的《现代密码学》)
设A=(a1,a2,...an)是由n个不同的正整数构成的n元组,s是另一个正整数。
背包问题就是从A中求出所有的a,使其和等于s。其中A称为背包向量,s为背包容积。
例:A=(43 ,129, 215, 473, 903, 302, 561,1165, 697, 1523),s=3231。
3231=129+473+903+561+1165
所以,从A中找出的数有129,473,903,561,1165。
二、作为密码可用性分析
1、抗穷举搜索分析
作为密码,最怕的就是穷举搜索。上面的例题中有10元素,每个元素有选取(用'1'表示)和不选取('0'表示)两种状态,故共有个子集,包含空集,也就是说有种组合。我们往往会选取元素很多的集合,比如512个,即有种组合,对计算机来说,遍历已经相当困难了。
2、单向函数
将元素选取选取与否所构成的二进制数据作为自变量x,将背包容量s作为因变量f(x)。
如上述例题:f(364)=f(0101101100)=129+473+903+561+1165=3231很容易求得
可以发现,已知x求f(x)很,但已知f(x)求x就有(当集合长度为n时,有)种可能。
三、f(x)的陷门和序列的伪装
因为信息的传输信道是公用的,直接将上述的x传输没有秘密可言。而且我们选用的背包向量A往往很长,将背包向量A传输,无疑会增加传输的负担。因此我们需要对A进行伪装,为了接收方能够破解还需要找到单向函数f(x)的陷门。
1、f(x)的陷门
我们引入一个特殊的背包向量——“超递增”背包向量A=(