上一篇可以稱為 (3,6) 的秘密分享方案,代表有6個參與者,每位都有一個空間中的平面方程式,至少3位才能求出平面的交點來重組秘密。
一般性的 (k,n) 秘密分享方案需要 n 個 k 維的超平面(hyperplanes)方程式( a_1x_1+a_2x_2+a_3 x_3+\ldots+a_kx_k=b )。
當k個人聚在一起要重組秘密時,將超平面方程式收集起來
\displaystyle \matrix{
a_{11}x_1+a_{12}x_2+a_{13}x_3+\ldots+a_{1k}x_k=b_1 \pmod{p} \cr
a_{21}x_1+a_{22}x_2+a_{23}x_3+\ldots+a_{2k}x_k=b_2 \pmod{p} \cr
\ldots \cr
a_{k1}x_1+a_{k2}x_2+a_{k3}x_3+\ldots+a_{kk}x_k=b_k \pmod{p}}
改寫成矩陣形式
\displaystyle \pmatrix{
a_{11} & a_{12} & a_{13} & \ldots & a_{1k} \cr
a_{21} & a_{22} & a_{23} & \ldots & a_{2k} \cr
\vdots & \vdots & \vdots & \ddots & \vdots \cr
a_{k1} & a_{k2} & a_{k3} & \ldots & a_{kk} }
\pmatrix{x_1 \cr x_2 \cr x_3 \cr \vdots \cr x_k} \equiv
\pmatrix{b_1 \cr b_2 \cr b_3 \cr \vdots \cr b_k} \pmod{p}
因為這些超平面方程式互不平行,所以聯立方程組有惟一解,其中 x_1 就是秘密S
例子
有8個人各擁有一個超平面方程式,約定在 F_{65537} 底下運算
\displaystyle \matrix{
49113x_1+5683x_2+30540x_3+43481x_4+47688x_5+20331x_6=-8762 \cr
6671x_1+24953x_2+40161x_3+57696x_4+31204x_5+13769x_6=16308 \cr
6093x_1+63576x_2+58177x_3+11336x_4+56130x_5+52284x_6=17725 \cr
1550x_1+61347x_2+51763x_3+6103x_4+56842x_5+24958x_6=19053 \cr
54066x_1+34186x_2+31828x_3+8249x_4+23728x_5+47682x_6=-18298 \cr
58433x_1+20124x_2+62414x_3+22027x_4+34969x_5+63343x_6=-8396 \cr
16502x_1+23915x_2+26371x_3+45158x_4+30220x_5+16212x_6=20957 \cr
58810x_1+59547x_2+21555x_3+32712x_4+20787x_5+12223x_6=-20354}
只要有6個人聚在一起就能重組秘密
\displaystyle \pmatrix{
6093 & 63576 & 58177 & 11336 & 56130 & 52284 \cr
54066 & 34186 & 31828 & 8249 & 23728 & 47682 \cr
58810 & 59547 & 21555 & 32712 & 20787 & 12223 \cr
49113 & 5683 & 30540 & 43481 & 47688 & 20331 \cr
58433 & 20124 & 62414 & 22027 & 34969 & 63343 \cr
6671 & 24953 & 40161 & 57696 & 31204 & 13769 } \pmatrix{x_1 \cr x_2 \cr x_3 \cr x_4 \cr x_5 \cr x_6} \equiv
\pmatrix{17725 \cr -18298 \cr -20354 \cr -8762 \cr -8396 \cr 16308} \pmod{65537}
解聯立方程式得到交點
\displaystyle \pmatrix{x_1 \cr x_2 \cr x_3 \cr x_4 \cr x_5 \cr x_6} \equiv
\pmatrix{12345 \cr -5429 \cr 31816 \cr 4877 \cr 18871 \cr 5290} \pmod{65537}
其中 x_1=12345 就是秘密S
設定秘密S
(%i1) S:12345;
(%o1) 12345
設定在Fp底下運算,其中p為質數
(%i2)
p:65537;
modulus:p;
(%o2) 65537
(%o3) 65537
有n個人要共享秘密,至少k個人才能重組秘密
(%i4)
n:8;
k:6;
(%o4) 8
(%o5) 6
假設全部平面的交點(x1,x2,x3,x4,x5,x6)
其中x1=S,X2,X3,X4,X5,X6為任意數字
(%i6) matrixX:genmatrix(lambda([i,j],if i=1 then S else random(p)),k,1);
(%o6) \displaystyle \pmatrix{12345 \cr 60108 \cr 31816 \cr 4877 \cr 18871 \cr 5290}
產生n個超平面方程式a1x1+a2x2+...+a6x6=b
(%i7) matrixA:genmatrix(lambda([i,j],random(p)),n,k);
(%o7) \displaystyle \pmatrix{
49113 & 5683 & 30540 & 43481 & 47688 & 20331 \cr
6671 & 24953 & 40161 & 57696 & 31204 & 13769 \cr
6093 & 63576 & 58177 & 11336 & 56130 & 52284 \cr
1550 & 61347 & 51763 & 6103 & 56842 & 24958 \cr
54066 & 34186 & 31828 & 8249 & 23728 & 47682 \cr
58433 & 20124 & 62414 & 22027 & 34969 & 63343 \cr
16502 & 23915 & 26371 & 45158 & 30220 & 16212 \cr
58810 & 59547 & 21555 & 32712 & 20787 & 12223}
矩陣A和交點坐標相乘得到超平面方程式的常數項(矩陣B)
A.X=B
(%i8) matrixB:rat(matrixA.matrixX);
(%o8)/R/ \displaystyle \pmatrix{-8762 \cr 16308 \cr 17725 \cr 19053 \cr -18298 \cr 8396 \cr 20957 \cr -20354}
將這n個超平面方程式分派給n個人
(%i9)
transpose(append(transpose(matrixA),transpose(matrixB)))$
create_list(%[ i ],i,1,n);
(%o10)/R/ \matrix{[[49113,5683,30540,43481,47688,20331,-8762],\cr
[
6671,24953,40161,57696,31204,13769,16308], \cr
[6093,63576,
58177,11336,56130,52284,17725], \cr
[1550,61347,51763,6103,
56842,24958,19053], \cr
[54066,34186,31828,8249,23728,47682,-
18298], \cr
[58433,20124,62414,22027,34969,63343,-8396], \cr
[
16502,23915,26371,45158,30220,16212,20957], \cr
[58810,59547,
21555,32712,20787,12223,-20354]]}
其中k個人聚在一起要重組秘密S
(%i11)
random_permutation(%)$
shadows:apply('matrix,rest(%,n-k));
(%o12)/R/ \displaystyle \pmatrix{
6093 & 63576 & 58177 & 11336 & 56130 & 52284 & 17725 \cr
54066 & 34186 & 31828 & 8249 & 23728 & 47682 & -18298 \cr
58810 & 59547 & 21555 & 32712 & 20787 & 12223 & -20354 \cr
49113 & 5683 & 30540 & 43481 & 47688 & 20331 & -8762 \cr
58433 & 20124 & 62414 & 22027 & 34969 & 63343 & -8396 \cr
6671 & 24953 & 40161 & 57696 & 31204 & 13769 & 16308}
求出k個超平面方程式的交點坐標
(%i13)
A:submatrix(shadows,k+1)$
B:col(shadows,k+1)$
linsolve_by_lu(A,B);
(%o15) \displaystyle [ \pmatrix{
-\frac{239491479314553105644042475017644464141348447204156669689205637453765303376528277604}
{216396336661829004078184209560598894913754528761549337466792501379219596480279330621} \cr \cr
\frac{1210805713819882573289422222280783600688940179592831917819578082169049120990916334350266}
{19113321079899398891561301316928566622410951815332061591718561061341473390034415245174541} \cr \cr
-\frac{37644552818254310466065473507177075951008884574753786958432937812591617153278450}
{106546694565154605651493948577350514482400063398104055867450763849935793441791891} \cr \cr
\frac{63479880358930370859878647750293235168149198063790494688930192308562}
{66968254011130256410216439253313699375179209442652365784366974851833} \cr \cr
-\frac{11513040138995712259570392386228043283995950153230}
{22465424471730794622726083901131483083365892339583} \cr \cr
\frac{549677002877614509907708808}{851081629302730915840058149}},false]
雖然算出來是分數,但在Fp底下運算,化簡後得到交點坐標
(%i16) rat(%);
(%o16)/R/ \displaystyle [ \pmatrix{12345 \cr -5429 \cr 31816 \cr 4877 \cr 18871 \cr 5290},false]
其中x1就是秘密S=12345
(%i17) %[1][1][1];
(%o17)/R/ 12345