背包加密

背包加密算法

背包加密算法是第一个通用公钥加密算法。

它是由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

posted @ 2023-01-14 16:52  Mar10  阅读(636)  评论(0编辑  收藏  举报