背包加密算法是第一个通用公钥加密算法。它是由Ralph Merkle和Mertin Hellman于1978年开发的。由于它是公钥密码术,因此需要两个不同的密钥。一个是用于加密过程的公钥,另一个是用于解密过程的私钥。在此算法中,我们将解决两个不同的背包问题,其中一个很容易,而另一个则很困难。简易背包用作私钥,硬背包用作公钥。简易背包用于派生硬背包。
对于简易背包,我们将选择超级增加背包问题。超增加背包是一个序列,其中每个下一个项都大于所有先前项的总和。
例子 –
{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:
选择一个超级增加的背包{1、2、4、10、20、40}作为私钥。 - 第2步:
选择两个数字n和m。将私钥的所有值乘以数字n,然后求模m。 m的值必须大于私钥中所有值的总和(例如,示例110)。数字n与m(例如,示例31)不应具有公因数。 - 步骤3:
使用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。
1.加密:
由于背包包含六个值,因此我们将纯文本分为六个组:
100100 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。
2.解密:
接收者接收必须解密的密文。接收器还知道m和n的值。
因此,首先我们需要找到 ,它是n mod m的乘法逆,即
nx mod(m)= 1 31 x mod(110)= 1 = 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
And, 205 x 71 mod(110) = 35
1+4+10+20=35 = 101110
合并它们后,我们得到了解码后的文本。
100100111100101110这是我们的纯文本。