1前言
本文部分轉自或者翻譯兩個鏈接的內容。
http://blog.csdn.net/qq_31917799/article/details/64130579
https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing
在一篇論文中看到了這樣的一個門限祕密共享算法,是一個(4,4)的,首先將祕密信息轉成01字符串s,然後隨機懸着3個與之長度相同的01字符串s1,s2,s3,將s與s1,s2,s3進行異或,得到s4,就是s4 = s^s1^s2^s3,然後4個祕密信息就是s1,s2,s3,s4,分配給4個人, 只有4個人的時候才能解得祕密信息s = s1^s2^s3^s4。
這個思路比較簡單,但是我們常說的門限祕密共享(k,n),一般k < n ,雖然要求是k<=n。
2 祕密共享的概念
門限祕密共享的概念:(k,n)門限祕密共享表示把祕密信息分成n份無意義的子祕密,只有擁有至少k份子祕密才能恢復祕密信息。
3 經典門限祕密共享解決方案
3.1 shamir算法
目前實現祕密共享技術的算法有多種,其中出名的就有shamir算法。該算法是基於拉格朗日插值公式實現的。
原理
分發祕密:
首先選擇有限域Fq,q>=n。設參與者集合爲P={P1,P2,……,Pn},k爲門限值,祕密信息s。選擇Fq上的n個互不相同的非零元素x1,x2,……,xn,公開這些元素。
隨機選擇Fq上的k-1次多項式f(x) =a0 + a1x + … + ak-1x^(k-1),其中a0=s,也就是祕密信息,其餘的ai隨機的選擇自Fq。分別計算si= f(xi),i=1,2,…,n,將(xi,si)作爲子祕密分發給成員Pi。
合併祕密
任意k個成員可以將其持有的子祕密共享,從而通過拉格朗日插值公式恢復出子祕密s。設k個成員的子祕密爲{(xi1,si1),…,(xk1,sk1)},拉格朗日插值公式如下圖:
對於任意的,j=1,2,…,k,上式右端計算的結果恰好是。由多項式理論可知,若兩個k-1次多項式在變量的k個不同取值處得到的函數值相等,則這兩個多項式必定相等,於是上式成立,即f(x)=g(x)。由此計算出s=a0=g(0)。
但是上述的方案還是存在的問題的。以下將詳細描述。
問題
假設 。這些都是要公開的信息。這裏我們的a0=S=1234,a1=166,a2=94,這些是我們保密的信息。
小海已經知道有兩個點 和 和以上的公開信息。但是由於他不知道第三個點的值,所以他無法直接得到S。但是小海很聰明。他已經知道了k=3且S=a0,則他可以得到
。
代入已知道的的兩個點的值。
代入D0,則有
式子1
代入D1,則有
式子2
兩式相減,則有
則小海可以推算出
他知道 。所以他可以進行推算
當計算到a2=149之後,他就不會再繼續下去了,因爲他知道再計算下去的話,a1就會爲負數。但是由於 ,所以不會出現這種情況。這樣的話,小海就可以得到 。
將式子1的a1替換爲a2,那麼小海將會得到
。
將上述求出的a2的取值範圍代入,將會得到
即
這樣的話,小海則只需要推算150次即可獲得祕密S。
顯然,這是不合理的。
3.2 shamir算法提升
以上問題的解決方法爲:取一個大的整數P,。P要大於任意係數ai(包括祕密S=a0)。將以上的在分發祕密時得到的f(xi)進行取模,即將 分發出去,而不是 。
同樣的我們的保密的信息爲a0=S=1234,a1=166,a2=94。而公開的信息爲
n=6,k=3,公開的式子不再是 ,
而是 mod p。
因爲已經知道P大於任意的ai。所以對於P的取值需要一定的技巧,即不能太過於接近a0。因爲a0=s,若已知P=1234的話,則只需要遍歷1234次即可得到祕密S。顯然這不是我們希望看見的。
這裏作爲例子,我們取值P=1613作爲示範。
即分發的式子爲
f(x)=1234+166x+94x^2 mod 1613。
則我們可以得到 。
假設小海這時已經得到兩點: , 。
利用以上的公開信息,他可以得到
。
代入得到的D1和D2兩點,有:
(3)
以及
f(x): 329 = S + 2a1 + 4a2 - 1613m2 (4)
(4) – (3),得
329 – 1494 = a1 + 3a2 -1613(m1 – m2)。
即
a1 = -1165 – 3a2 + 1613(m1 – m2)。
這時,由於小海不知道任何關於m1和m2的信息,所以他無法得出a1或者a2的範圍,這較好的保護了我們的祕密。