延續上一篇,提供另一個例子
設定n個人共享秘密,至少要k個人才能重建秘密
(%i1)
n:8;
t:6;
(%o1) 8
(%o2) 6
隨機產生t列(t+1)行的矩陣V
(%i3) V:genmatrix(lambda([i, j],random(10)),t,t+1);
(%o3) \displaystyle \pmatrix{2&2&4&5&4&1&9 \cr 5&8&3&5&5&0&6 \cr 9&0&9&4&7&6&9 \cr 9&3&9&6&6&6&3 \cr 0&1&2&9&9&8&6 \cr 5&3&3&7&8&4&6}
計算V1,V2,...,Vt的外積U
(%i4)
addrow(V,create_list((-1)^i*ident(t+1)[ i ],i,1,t+1));
U:determinant(%);
(%o4) \displaystyle \pmatrix{2&2&4&5&4&1&9 \cr 5&8&3&5&5&0&6 \cr 9&0&9&4&7&6&9 \cr 9&3&9&6&6&6&3 \cr 0&1&2&9&9&8&6 \cr 5&3&3&7&8&4&6 \cr [-1,0,0,0,0,0,0] & [0,1,0,0,0,0,0] & [0,0,-1,0,0,0,0] & [0,0,0,1,0,0,0] & [0,0,0,0,-1,0,0] & [0,0,0,0,0,1,0] & [0,0,0,0,0,0,-1]}
(%o5) [-23496,1488,28440,17232,42288,24960,-13536]
公開U的第一個分量u1,其餘分量不公開
(%i6) u1:U[1];
(%o6) -23496
將剩下的分量相乘當成祕密S
(%i7) S:product(abs(U[ i ]),i,2,t+1);
(%o7) 10418861903245330297651200
隨機選取n列t行的矩陣A
(%i8) A:genmatrix(lambda([i,j],random(10)),n,t);
(%o8) \displaystyle \pmatrix{5&0&7&6&5&4 \cr 7&2&8&3&0&6 \cr 2&6&6&7&4&6 \cr 9&1&6&8&2&0 \cr 2&2&1&3&5&2 \cr 9&9&1&6&9&0 \cr 8&8&8&3&9&0 \cr 6&3&2&3&0&9}
將A矩陣和V矩陣相乘得到子秘密s
將每一列s[ i ]分派給這n個人
(%i9) s:A.V;
(%o9) \displaystyle \pmatrix{147&45&159&162&182&139&180 \cr 153&57&151&137&160&97&192 \cr 181&95&169&184&206&136&189 \cr 149&52&169&140&149&109&177 \cr 60&40&66&101&104&74&90 \cr 126&117&144&211&205&123&216 \cr 155&98&173&211&227&146&255 \cr 117&72&105&134&143&72&153}
假設有t個人聚在一起要重建秘密
將每個人所擁有的子秘密s[ i ]重組成矩陣V
(%i10) V:apply('matrix,rest(random_permutation(args(s)),n-t));
(%o10) \displaystyle \pmatrix{155&98&173&211&227&146&255 \cr 147&45&159&162&182&139&180 \cr 117&72&105&134&143&72&153 \cr 181&95&169&184&206&136&189 \cr 153&57&151&137&160&97&192 \cr 60&40&66&101&104&74&90}
計算V1,V2,...,Vt的外積U
(%i11)
addrow(V,create_list((-1)^i*ident(t+1)[ i ],i,1,t+1));
U:determinant(%);
(%o11) \displaystyle \pmatrix{155&98&173&211&227&146&255 \cr 147&45&159&162&182&139&180 \cr 117&72&105&134&143&72&153 \cr 181&95&169&184&206&136&189 \cr 153&57&151&137&160&97&192 \cr 60&40&66&101&104&74&90 \cr [-1,0,0,0,0,0,0] & [0,1,0,0,0,0,0] & [0,0,-1,0,0,0,0] & [0,0,0,1,0,0,0] & [0,0,0,0,-1,0,0] & [0,0,0,0,0,1,0] & [0,0,0,0,0,0,-1]}
(%o12) [238719360,-15118080,-288950400,-175077120,-429646080,-253593600,137525760]
將外積U的第一個分量除以之前公開的u1,得到相差的倍數h
(%i13) h:U[1]/u1;
(%o13) -10160
將剩下的分量相乘得到祕密S
(%i14) S:product(abs(U[ i ]/h),i,2,t+1);
(%o14) 10418861903245330297651200