基於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

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