揹包密碼體制及python實現

2021-10-10 19:43:22 字數 1828 閱讀 2857

1.揹包問題

設a = (a1

_11​

,a2

_22​

,…,an

_nn​

)是由n個不同的正整數構成的n元組,s是另一已知的正整數。揹包問題就是從a中求出所有的 ai

_ii​

,使其和等於s。其中a稱為揹包向量,s是揹包的容積。

從原則上講,如果揹包問題有解的話,通過檢查a的所有子集,總可以找到問題的解。然而如果a中元素個數n很大,子集個數2

n2^n

2n將非常大,尋找滿足要求的子集沒有比窮舉法更好的演算法,因此揹包問題是npc問題。

2.超遞增序列

由於揹包問題是npc問題,因此需引入一種特殊型別的揹包向量,使得揹包問題較容易去求解。

這裡將介紹超遞增序列,揹包向量a = (a1

_11​

,a2

_22​

,…,an

_nn​

)稱為超遞增的,如果滿足aj

_jj​

> ∑i=

0j−1

\sum_^

∑i=0j−

1​ai

_ii​

, j = 2,…,n。超遞增揹包向量對應的揹包問題很容易通過貪心演算法求解,即已知s為揹包容積,對a從右向左檢查每一元素,若s≥an,則an在解中;若s ∑i=

1n\sum_^

∑i=1n​

ai

_ii​

,(t,k)=1,即t在模k下有乘法逆元。設bi ≡ t* ai

_ii​

mod k, i = 1,2,…,n,得到乙個新的揹包向量b = (b1,b2,…bn),使用者以b作為自己的公鑰。

3.揹包密碼體制

(1)金鑰生成

選擇乙個超遞增序列a = (a1

_11​

,a2

_22​

,…,an

_nn​

),選擇隨機數m,滿足m> ∑i=

1n\sum_^

∑i=1n​

ai

_ii​

,再選擇隨機數u,滿足(u,m)=1且m > u,計算bi = uai mod m, 1≤i≤n,得到公鑰b = (b1,b2,…,bn),私鑰則為a,m,u。

(2)加密

明文m = (m1,m2,…,mn)是長度為n的位元串。使用公鑰b = (b1,b2,…,bn)計算密文:c = m1b1+m2b2+…+mnbn。

(3)解密

計算uu-1 ≡ 1 mod m,s = u-1c mod m,由s和超遞增序列a根據貪心演算法即可恢復明文m。

(4)示例

有超遞增序列a=(3,11,24,50,115),選取m=250,u=113,計算bi = uai mod m, 1≤i≤n,得到公鑰b = (89,243,212,150,245)。有明文序列m=(1,0,1,0,1),加密後有c=m1b1+m2b2+m3b3+m4b4+m5b5=546。

由uu-1 ≡ 1 mod m計算得u-1=177,s = u-1c mod m = 142,由s對a=(3,11,24,50,115)從右向左比對,142>115,則令x5=1,142-115=27<50,則x4=0,同理x3=1,x2=0,x1=1,因此得到明文m=(1,0,1,0,1)。

4.實現

揹包問題 python實現

根據自己的理解,用python寫了揹包問題的求解 問題描述 給定一組物品,每種物品都有自己的重量和 在限定的重量內,如何選擇才能使物品的總價最高?1.使用動態規劃的思想來解決揹包問題 解決思路 動態規劃,對每一件物品遍歷揹包容量,當揹包可容納值大於等於當前物品,與之前已放進去的物品所得價值進行對比,...

python揹包問題 揹包問題Python

題目 揹包容量ba 物品thing v 問題 1.是否可以裝滿揹包2.裝滿揹包最少需要多少件物品3.裝滿揹包最多需要多少件物品4.該揹包最多一共可以裝多重的物品5.裝滿揹包一共有多少種方案 就算物品重量一樣,但也是不同的方案 一 01揹包 def bag 01 bag v,thing v 是否可以裝...

python多重揹包 多重揹包

多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...