背包加密算法
背包加密算法是第一个通用公钥加密算法。
它是由Ralph Merkle 和 Mertin Hellman 于1978年开发的。由于它是公钥密码术,因此需要两个不同的密钥。一个是用于加密过程的公钥,另一个是用于解密过程的私钥。在此算法中,我们将解决两个不同的背包问题,其中一个很容易,而另一个则很困难。简易背包用作私钥,硬背包用作公钥。简易背包用于派生硬背包。
背包问题介绍
给定一些物体,每个物体有不同的重量,是否有可能将这些物体放入一个背包,使背包的重量等于一个给定的值。
举例:
这些物体的重量分别为1,5,6,11,14,20,则可将重5,6,11的物体放入,装成一个重22的背包。但是无法装成一个重24的背包
总结:
- 背包问题:等于一个给定的值。
- 解为选择物品装入的情况,装入用1,未装入用0。例子中对给定值22的解为{0,1,1,1,0,0}。
- 这个问题需要的时间随物体的数量的增加成指数时间。
基本原理
实例:
明文: 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0
密钥: 1 5 6 11 14 20 1 5 6 11 14 20 1 5 6 11 14 20
密文: 1+5+6+20=32 5+11+14=30 5+6=11
总结:
- 明文为物品的装入情况,是1/0的序列,而且明文长度等于物体的个数,表示从中选取物体装入背包
- 密文为选取物体的质量和
- 密钥为背包问题中物品重量序列
算法的关键是有两个不同的背包重量序列,这两个重量序列对于给定的相同的值,解相同(物品的装入情况相同)
前者物品的重量列表是递增的,后者则是无序的,前者可以解密
构造超递增序列背包
超递增序列:
比如:这样一个序列{1,3,5,11,22}就是超递增的,后面的数大于前面数的和,如:1+3<5,1+3+5<11,1+3+5+11<22
举例:
{1, 2, 4, 10, 20, 40} is a super increasing as
1<2, 1+2<4, 1+2+4<10, 1+2+4+10<20 and 1+2+4+10+20<40.
派生公钥:
背包算法先找到一个递增背包的重量序列作为私钥,再由此构造一个序列(有相同解的一般背包问题的序列)作为公钥
步骤一
选择超递增序列 {1, 2, 4, 10, 20, 40} 作为私钥
步骤二
选择两个数字n和m。将私钥的所有值乘以数字n,然后求模m。 m的值必须大于私钥中所有值的总和,数字n与m不应具有公因数。
此处示例 m=110,n=31
步骤三
使用m和n计算公钥值
1x31 mod(110) = 31
2x31 mod(110) = 62
4x31 mod(110) = 14
10x31 mod(110) = 90
20x31 mod(110) = 70
40x31 mod(110) = 30
因此,我们的 公钥为{31,62,14,90,70,30} 私钥是{1、2、4、10、20、40}
示例:
让我们的纯文本为100100111100101110
加密:
由于背包包含六个值,因此我们将纯文本分为六个组:
10010 111100 101110
将公钥的每个值与每个组的对应值相乘并求和。
100100 {31, 62, 14, 90, 70, 30}
1x31+0x62+0x14+1x90+0x70+0x30 = 121
111100 {31, 62, 14, 90, 70, 30}
1x31+1x62+1x14+1x90+0x70+0x30 = 197
101110 {31, 62, 14, 90, 70, 30}
1x31+0x62+1x14+1x90+1x70+0x30 = 205
因此,我们的密文为121 197 205。
解密:
接收者接收必须解密的密文。接收器还知道m和n的值。
因此,首先我们需要找到$$n^{-1}$$,它是 n mod m 的 乘法逆,即 $$n\cdot{n^{-1}}mod(m)=1$$
故计算 $$31\cdot{n^{-1}}mod(110)=1$$ 解得 $${n^{-1}}=71$$
python写法:
import gmpy2
n=31
m=110
n1=gmpy2.invert(n,m)
print(n1)
//n1=71
现在,我们必须将密文的每个块乘以71,然后乘以71。
121 x 71 mod(110) = 11
然后,我们将必须根据私钥{1、2、4、10、20、40}的值得出11的总和,即1 + 10 = 11,因此使对应的位1和其他0为100100。
同样的,
197 x 71 mod(110) = 17
1+2+4+10=17 = 111100
205 x 71 mod(110) = 35
1+4+10+20=35 = 101110
合并它们后,我们得到了解码后的文本。
100100111100101110这是我们的纯文本。
部分内容转载于
https://www.cnblogs.com/0zcl/p/6111686.html
https://www.imangodoc.com/167266.html
标签:11,背包,20,14,110,加密,mod From: https://www.cnblogs.com/Mar10/p/17052066.html