背包問題介紹:
給定一些物體,每個物體有不同的重量,是否有可能將這些物體放入一個背包,使背包的重量等於一個給定的值。
- 背包算法為第一個推廣的公開密鑰加密算法。
- 雖然后來發現這個算法不安全,但仍值得研究,因為它表示了如何將NP完全問題用於公開密鑰算法(好吧,這個我不知道是什么意思~)。
舉例:
這些物體的重量分別為1,5,6,11,14,20,則可將重5,6,11的物體放入,裝成一個重22的背包。但是無法裝成一個重24的背包。
- 背包問題:等於一個給定的值。
- 解為選擇物品裝入的情況,裝入用1,未裝入用0.例子中對給定值22的解為{0,1,1,1,0,0}
- 這個問題需要的時間隨物體的數量的增加成指數時間。
基本原理
首先,背包算法用於信息安全(密碼法),我們總得搞清楚什么是明文,密文,密鑰吧?!
舉例:
明文: 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0
密鑰: 1 5 6 11 14 20 1 5 6 11 14 20 1 5 6 11 14 20
密文: 1+5+6+20=32 5+11+14=30 5+6=11
從上面可以總結:
- 明文為物品的裝入情況,是1/0的序列,而且明文長度等於物體的個數,表示從中選取物體裝入背包
- 密文為選取物體的質量和
- 密鑰為背包問題中物品重量序列
算法安全性體現為:
若攻擊者獲得密文、密鑰,也無法在線性時間內求明文(物品的裝入情況)
算法的關鍵
算法的關鍵是有兩個不同的背包重量序列,這兩個重量序列對於給定的相同的值,解相同(物品的裝入情況相同)
前者物品的重量列表是遞增的,后者則是無序的
前者可以解密,看下面~~
1、構造遞增序列背包
易解的背包問題:若物品的重量列表為一個超遞增序列,則該背包問題很容易解的。
比如遞增序列:1 3 6 13 27 52
舉例:
- 非遞增背包是一個難問題
- 背包算法先找到一個遞增背包的重量序列作為私鑰,再由此構造一個序列(有相同解的一般背包問題的序列)作為公鑰(重要!)
如何構造公鑰呢?
2、從私鑰構造公鑰
經過上面的計算,序列為:{62 93 81 88 102 37}作為公鑰
3、加密
4、解密
解密這里我遇到一個問題:如何求n-1,即如何求n關於模m的逆元??(注意:這里必須搞懂,不然下一篇博客RSA算法就肯定不懂的!)
我百度找了好多,也看了別了的博客,比如http://blog.sina.com.cn/s/blog_65a5cf5e0100nyqo.html,但我看不懂啊!!終於我找到了一個我能看懂的求逆元方法<輾轉相除法求模的逆元>!(已經編程實現),下篇博客會發出來~~
為了方便我整理,我把求逆元相關的過程截圖出來,大家也可以點鏈接去看~ ending~