秘密共享算法

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

  • 11
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shamir秘密共享算法是一种通过将秘密信息分割成多个部分,分发给不同的参与者,使得只有集齐足够数量的部分才能恢复出原始秘密信息的算法。下面将介绍一个Shamir秘密共享算法的实验设计。 实验目标:验证Shamir秘密共享算法的可行性和正确性。 实验步骤: 1. 确定参与者数量和秘密信息的长度,假设有k个参与者分别称为P1, P2, ..., Pk,并且秘密信息由一个整数表示。 2. 生成一个(k-1)次的多项式函数,其中常数项为秘密信息,其它项为随机生成的系数。将该函数表示为f(x) = a0 + a1*x + a2*x^2 + ... + a(k-1)*x^(k-1)。 3. 将多项式函数f(x)代入不同的x坐标(对应参与者),计算出对应的y坐标(对应分发给参与者的部分秘密信息)。 4. 将生成的坐标对(x, y)分发给相应的参与者,每个参与者只收到一个坐标对。 5. 只有集齐至少k个参与者的坐标对,秘密信息才能被恢复。 6. 验证恢复出的秘密信息是否正确,并与原始秘密信息进行对比。 实验要点: 1. 多项式函数的生成需要保证随机性,可以使用随机数生成器来产生系数。 2. 参与者之间必须保持沟通,以便在恢复秘密信息时,能够及时共享各自持有的部分信息。 3. 实验中的参与者数量k和多项式次数(k-1)需要事先确定,并满足k的选择与算法要求的阈值条件。 通过这样的实验设计,可以验证Shamir秘密共享算法的正确性和可行性。并且,这个实验可以帮助理解Shamir秘密共享算法的原理和应用场景,帮助学习者更好地掌握该算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值