3.解決子集合加總問題-Lagarias和Odlyzko方法
雖然背包加密已經被\(Shamir\)破解了,但後續有更多學者針對子集合加總問題(\(subset\) \(sum\) \(problem\))進行研究。像\(Lagarias\)和\(Odlyzko\)在1985年提出基於\(LLL\)演算法解決子集合加總問題。
子集合加總問題為找出\( x_1,x_2,\ldots,x_n \)的值讓\(x_1a_1+x_2a_2+\ldots+x_na_n=s\),其中\(x_1,x_2,\ldots x_n \in \{\;0,1 \}\;\)。
\(Lagarias\)和\(Odlyzko\)的解決辦法如下,利用\( a_1,a_2,\ldots,a_n \)和\(s\)(註1),建構\( (n+1)\times (n+1) \)的矩陣\(B\)
\( B=\left[ \matrix{1&0&0&\ldots&0&-a_1 \cr
0&1&0&\ldots&0&-a_2 \cr
0&0&1&\ldots&0&-a_3 \cr
\vdots&\vdots&\vdots&\vdots&\vdots&\vdots \cr
0&0&0&\ldots&1&-a_n \cr
0&0&0&\ldots&0&s} \right] \)
其中\(B\)矩陣的每一列向量\(b_1,b_2,\ldots,b_{n+1}\)都是線性獨立,形成\(lattice\)的基底(\(basis\))。
註1:
雖然前面wiki文章採用公鑰\(\beta\)和密文\(c\),但一般介紹子集合加總問題卻採用\(a_i\)和\(s\),這裡也用相同符號。
設\(b_1,b_2,\ldots,b_{n+1}\)的線性組合為
\(x_1 b_1+x_2 b_2+\ldots+x_n b_n+1\cdot b_{n+1}=
\matrix{x_1 \left[1,0,0,\ldots,0,-a_1 \right]+ \cr
x_2 \left[0,1,0,\ldots,0,-a_2 \right]+ \cr
\ldots \cr
x_n \left[0,0,0,\ldots,1,-a_n \right]+ \cr
1 \left[0,0,0,\ldots \ldots,0,s \right]}=
\left[x_1,x_2,\ldots,x_n,-x_1a_1-x_2a_2-\ldots-x_na_n+s \right] \)
經\(LLL\)演算法化簡後,第一行向量是整個\(lattice\)中長度較短的向量,若最後一元為0,則\(-x_1a_1-x_2a_2-\ldots-x_na_n+s=0\),符合子集合加總問題的\(x_1a_1+x_2a_2+\ldots+x_na_n=s\),而答案就是前面\(x_1,x_2,\ldots,x_n\)。
論文中還定義了\(a=(a_1,a_2,\ldots,a_n)\)的密度\( \displaystyle d(a)=\frac{n}{log_2 max_i(a_i)} \),\(d(a)\)用來測量明文和密文轉換時的資訊比率(information rate)
\( \displaystyle d(a)\approx \frac{明文的bits數}{密文平均的bits數} \)
利用本論文所定義的\(lattice\)和使用\(LLL\)演算法化簡可以破解低密度子集合加總問題,在密度\(d(a)<0.645\)的子集合加總問題幾乎可以(almost all)在多項式時間內解出來。以維基百科為範例計算密度\( \displaystyle d(a)=\frac{8}{log_2 592}=0.869 \),雖然沒符合\(d(a)<0.645\),但還是得到解答,代表高密度背包問題不一定解不出來只是成功率會下降。
參考資料
J. C. Lagarias and A. M. Odlyzko. 1985. Solving low-density subset sum problems. J. ACM 32, 1 (January 1985), 229-246.
https://web.stevens.edu/algebrai ... m/p229-lagarias.pdf
請下載LLL.zip,解壓縮後將LLL.mac放到C:\maxima-5.42.2\share\maxima\5.42.2\share目錄下
要先載入LLL.mac才能使用LLL指令
(%i1) load("LLL.mac");
(%o1) C:\maxima-5.42.2\share\maxima\5.42.2\share\LLL.mac
物品重量
(%i2) a:[295,592,301,14,28,353,120,236];
(%o2) \( \left[295,592,301,14,28,353,120,236 \right] \)
總和
(%i3) s:1129;
(%o4) \(1129\)
形成lattice
(%i4)
B:matrix([1,0,0,0,0,0,0,0,-295],
[0,1,0,0,0,0,0,0,-592],
[0,0,1,0,0,0,0,0,-301],
[0,0,0,1,0,0,0,0,-14],
[0,0,0,0,1,0,0,0,-28],
[0,0,0,0,0,1,0,0,-353],
[0,0,0,0,0,0,1,0,-120],
[0,0,0,0,0,0,0,1,-236],
[0,0,0,0,0,0,0,0,1129]);
(%o4) \( \left[ \matrix{1&0&0&0&0&0&0&0&-295\cr
0&1&0&0&0&0&0&0&-592\cr
0&0&1&0&0&0&0&0&-301\cr
0&0&0&1&0&0&0&0&-14\cr
0&0&0&0&1&0&0&0&-28\cr
0&0&0&0&0&1&0&0&-353\cr
0&0&0&0&0&0&1&0&-120\cr
0&0&0&0&0&0&0&1&-236\cr
0&0&0&0&0&0&0&0&1129} \right] \)
經LLL化簡
(%i5) B: LLL(B);
0 errors, 0 warnings
(%o5) \( \left[ \matrix{0&1&1&0&0&0&0&1&0\cr
0&0&0&-2&1&0&0&0&0\cr
1&-1&0&0&-2&1&0&0&0\cr
-2&1&0&0&0&0&0&0&-2\cr
0&-1&1&0&2&0&0&1&-1\cr
0&-1&0&0&0&0&1&2&0\cr
0&1&0&0&0&-1&-2&0&1\cr
1&1&-1&0&0&-2&1&0&0\cr
0&2&-1&1&0&1&-1&0&-1}\right] \)
第1列向量最後一元為0,且\(x_i\)數字為0或1
(%i6) B[1];
(%o6) \( \left[0,1,1,0,0,0,0,1,0 \right] \)
去掉最後一元,得到解答
(%i7) x:rest(B[1],-1);
(%o7) \( \left[0,1,1,0,0,0,0,1 \right] \)
驗證a乘上x是否等於s
(%i8) is(a.x=s);
(%o8) \(true\)
-----------
另一個範例取自Lattice Basis Reduction: An Introduction to the LLL Algorithm and Its Applications的第7章範例7.6
https://books.google.com.tw/book ... e&q&f=false
物品重量\(a=\left[a_1,a_2,\ldots,a_{15} \right]\)
\(a_1 = 929737936, a_2 = 970987227, a_3 = 787514290,\)
\(a_4 = 322163533, a_5 = 926801380, a_6 = 662236970,\)
\(a_7 = 572718201, a_8 = 499197496, a_9 = 270712809,\)
\(a_{10} = 142942483, a_{11} = 994479591, a_{12} = 143064843,\)
\(a_{13} = 724883274, a_{14} = 285884973, a_{15} = 71532418.\)
總和\(s=4740166124\)
試找出\(x_1,x_2,\ldots,x_n\),\(x_i \in \{\;0,1 \}\;\)使得\(\displaystyle \sum_{i=1}^n x_i\cdot a_i=s\)
要先載入LLL.mac才能使用LLL指令
(%i1) load(LLL);
(%o1) C:\maxima-5.42.2\share\maxima\5.42.2\share\LLL.mac
物品重量
(%i2)
a:[929737936,970987227,787514290,322163533,926801380,662236970,572718201,499197496,270712809,142942483,
994479591,143064843,724883274,285884973,71532418];
(%o2) \([929737936,970987227,787514290,322163533,926801380,662236970,572718201,499197496,270712809,142942483,\)
\(994479591,143064843,724883274,285884973,71532418 ]\)
a個數n
(%i3) n:length(a);
(%o3) \(15\)
總和s
(%i4) s:4740166124;
(%o4) \(4740166124\)
將-a和s放在一起
(%i5) column:transpose(matrix(append(-a,[s])));
(%o5) \( \left[ \matrix{-929737936\cr -970987227\cr -787514290\cr -322163533\cr -926801380\cr -662236970\cr -572718201\cr -499197496\cr -270712809\cr -142942483\cr -994479591\cr -143064843\cr -724883274\cr -285884973\cr -71532418\cr 4740166124}\right] \)
產生左半邊矩陣
(%i6) B:genmatrix(lambda([i,j],if i=j then 1 else 0),n+1,n);
(%o6) \(\left[ \matrix{1&0&0&0&0&0&0&0&0&0&0&0&0&0&0\cr
0&1&0&0&0&0&0&0&0&0&0&0&0&0&0\cr
0&0&1&0&0&0&0&0&0&0&0&0&0&0&0\cr
0&0&0&1&0&0&0&0&0&0&0&0&0&0&0\cr
0&0&0&0&1&0&0&0&0&0&0&0&0&0&0\cr
0&0&0&0&0&1&0&0&0&0&0&0&0&0&0\cr
0&0&0&0&0&0&1&0&0&0&0&0&0&0&0\cr
0&0&0&0&0&0&0&1&0&0&0&0&0&0&0\cr
0&0&0&0&0&0&0&0&1&0&0&0&0&0&0\cr
0&0&0&0&0&0&0&0&0&1&0&0&0&0&0\cr
0&0&0&0&0&0&0&0&0&0&1&0&0&0&0\cr
0&0&0&0&0&0&0&0&0&0&0&1&0&0&0\cr
0&0&0&0&0&0&0&0&0&0&0&0&1&0&0\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&1&0\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&0&1\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&0&0}\right] \)
將兩個矩陣合併
(%i7) B:addcol(B,column);
(%o7) \( \left[ \matrix{1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-929737936\cr
0&1&0&0&0&0&0&0&0&0&0&0&0&0&0&-970987227\cr
0&0&1&0&0&0&0&0&0&0&0&0&0&0&0&-787514290\cr
0&0&0&1&0&0&0&0&0&0&0&0&0&0&0&-322163533\cr
0&0&0&0&1&0&0&0&0&0&0&0&0&0&0&-926801380\cr
0&0&0&0&0&1&0&0&0&0&0&0&0&0&0&-662236970\cr
0&0&0&0&0&0&1&0&0&0&0&0&0&0&0&-572718201\cr
0&0&0&0&0&0&0&1&0&0&0&0&0&0&0&-499197496\cr
0&0&0&0&0&0&0&0&1&0&0&0&0&0&0&-270712809\cr
0&0&0&0&0&0&0&0&0&1&0&0&0&0&0&-142942483\cr
0&0&0&0&0&0&0&0&0&0&1&0&0&0&0&-994479591\cr
0&0&0&0&0&0&0&0&0&0&0&1&0&0&0&-143064843\cr
0&0&0&0&0&0&0&0&0&0&0&0&1&0&0&-724883274\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&1&0&-285884973\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&0&1&-71532418\cr
0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&4740166124}\right] \)
經LLL化簡
(%i8) B: LLL(B);
0 errors, 0 warnings
(%o8) \( \left[ \matrix{2&-1&-2&0&-1&0&1&1&2&0&0&0&0&0&0&0\cr
1&0&0&-1&0&-2&1&0&1&0&-1&1&1&0&0&1\cr
-1&0&-1&0&1&-1&0&2&-1&-1&0&1&1&0&0&-1\cr
0&1&2&1&-2&-1&0&1&0&1&-1&0&0&0&0&2\cr
-2&0&3&-1&-1&-1&0&0&1&1&1&0&0&0&0&2\cr
0&1&1&-1&-1&-2&0&2&2&0&0&0&-1&0&0&0\cr
0&0&1&-1&1&-1&0&-2&-1&0&2&0&-2&0&0&0\cr
1&0&-2&0&0&0&1&-1&0&2&0&0&0&1&0&0\cr
1&0&1&0&0&0&1&-1&0&-1&-1&0&-1&0&1&-1\cr
0&0&1&0&1&1&1&0&0&0&1&0&1&0&1&0\cr
1&0&0&-1&1&-1&1&2&1&1&-2&-1&-1&0&0&1\cr
0&-2&1&0&1&0&-1&1&-1&1&0&1&0&1&0&-1\cr
1&0&1&0&0&1&-2&0&1&0&-1&1&-1&0&1&1\cr
1&0&1&0&0&0&1&-1&0&1&-1&1&-1&-1&-1&-1\cr
-1&1&1&0&-1&0&0&-1&-1&2&0&0&1&-1&2&1\cr
-133&-99&-15&528&272&-278&-63&-129&302&78&0&-78&-17&-122&102&-40} \right] \)
第10列向量各個數字為0或1且最後一元為0
(%i9) B[10];
(%o9) \( \left[ 0,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0 \right] \)
去掉最後一元得到解答
(%i10) x:rest(B[10],-1);
(%o10) \( \left[ 0,0,1,0,1,1,1,0,0,0,1,0,1,0,1 \right] \)
驗證a乘上x是否等於s
(%i11) is(a.x=s);
(%o11) \(true\)