基于Merkle-Hellman的揹包加密

我把C++代码放在GitHub上了
GitHub地址:https://github.com/xxxuxonezero/password

**

生成公钥和私钥

**

要生成一个超递增序列privatekey,模数modnumber,乘数mulnumber,mulnumber关于modnumber的逆元inversemul,以及揹包序列publickey。
先生成一组数据,它们是超递增的,即满足第i个数字比前i-1个数字加起来的和还大。随机生成一个模数,满足它既是素数(为了能够用费马定理求出乘数的逆元),又比超递增序列所有数加起来的和还大,随机生成一个乘数,满足其与模数互质。
利用费马定理求逆元:inversemul=mulnumber^(modnumber-2)%modnumber;
关于逆元(数论):
与倒数差不多,不过逆元不一定为1/a
若a*b%p=1,则称b是a关于p的逆元
如何生成公钥?
publickey[i]=privatekey[i]*mulnumber%modnumber

**

加密与解密

**

本来想把加密和解密分成两个文件的,但是文件重定向读取字符串的时候,空格没办法读,我就干脆把加密和加密放一起了。
加密:
把数据转换成二进制序列ai,secretWord=ai*publickey[i];
于是就得到了密文
解密:
通过逆元求得cw=(secretWord * inversemul)%modnumber
用cw,配合私钥得到二进制序列,从而求得明文。
while(cw)
{
if(cw>=privatekey[i])
stack.push(1);
cw-=privatekey[i];
else
stack.push(0);
}

一个例子:
超递增序列为{1,2,4,8,16,32,64,128}
模数为347,乘数为39,逆元=39^345%347=89
揹包序列为{39, 78, 156, 312,277 ,207 ,67 ,134}
加密字符‘abc’,得到的密文为 368,301,435
(密文=∑bit_b[i]*publibkey[i])
通过逆元求得cw=(secretWord * inversemul)%modnumber
得到{134,70,198}
以w=134为例:
134>128 {1}
6>4 {1,0,0,0,0,1}
2>=2 {1,1,0,0,0,0,1}
w=0

于是得到的明文为97

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章