Merkle-Hellman揹包加密方案屬於子集和問題,這個加密算法易於求解並不安全,但是卻是這一類加密算法的基礎。主要使用的數學運算是模乘和置換。
- 超遞增序列
B =(b1,b2,b3,……,bn)是一個正整數序列,對於每一個i,2<= i <= n ,滿足bi > bj,也就是說序列中第i個數字,比之前的所有數字的和還大。 - 求解超遞增序列的子集和問題:
即求解B = {b1,b2,b3,……,bn}某個子集的和,設子集和爲s,s與bi(i從n開始到1)做比較,若s<bi則i=i-1,若s>=bi則s=s-bi並記錄當前i的值然後i=i-1直到s=0爲止。僞代碼:
i = n
while i >= 1:
if s > bi:
xi = 1
s = s - bi
else:
xi = 0
i = i - 1
return (x1, x2, …… ,xn)
xi爲1則B中第i位爲子集中的元素。
- 基本的Merkle-Hellman揹包加密的祕鑰生成
選擇一個超遞增序列B = {b1,b2,b3,……,bn} 和模數M,M > sum(B)
隨機選取一個整數W,1 <= W <= M-1, 使得gcd(W,M) = 1
隨機選取整數{1,2,3,……,n}的一個置換
計算ai = Wb(i) mod M, i = 1,2,……,n。
公鑰就是(a1,a2,a3,……,an),私鑰是(,M, W,B) - 加密
取出公鑰(a1,a2,a3,……,an)
將明文m表示爲長n的二進制串,m = m1,m2,m3……mn
計算整數c = m1 * a1 + m2 * a2 + …… + mn * an
c就是密文 - 解密
計算d = W -1 c mod M
通過求解超遞增子集和問題,求滿足d = r1 * b1 + r2 * b2 + …… + rn * bn的整數r1,r2,……rn,ri {0, 1}
明文的二進制串爲mi = r(i)
解密的證明:
d = W-1 *c = W-1 mi * ai = mi * b(i) (mod M)