秘密共享算法

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:拉格朗日插值公式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值