祕密共享算法

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)},拉格朗日插值公式如下圖:

https://img-blog.csdn.net/20170320190612111?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE5MTc3OTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

對於任意的,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的範圍,這較好的保護了我們的祕密。

 

附錄A:取模運算法則

附錄B:拉格朗日插值公式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章