-
秘密共享的概念最早由文献[1-2]提出. 文献[1]利用拉格朗日插值多项式构造了一个门限秘密共享方案,其主要思想是二维平面内任意t个点都可唯一确定一个t-1次多项式. 任何t个及t个以上的参与者联合可以重构多项式,得到的常数项即为分享的秘密. 反之,任何小于t个参与者的集合不能重构多项式,从而不能获得秘密. 文献[2]利用线性投影几何原理的性质构造的门限方案,t个t-1维超平面可以确定t维空间中一个点,但小于t个是无法确定的. 这两个经典的门限秘密共享方案为研究不同访问结构(access structure)上的秘密共享奠定了基础[3]. 文献[4]提出了基于中国剩余定理的门限秘密共享方案,秘密份额是秘密的同余类,满足t个同余方程的解在取值范围中是唯一的,少于t个方程,解无法确定. 文献[5]利用矩阵乘法构造了一个秘密共享方案,其原理等价于解含有t个未知数的线性方程组,每个共享份额相当于一个线性方程,任意大于等于t个份额联立可以求得t个未知数,而其中的一个未知数恰为分享的秘密,当方程个数小于未知数个数的时候无法确定方程组的解,从而不能恢复共享的秘密. 上述几种构造秘密共享方案的方法是最常用的几种方法,此外,文献[6]中指出,一个RS码对应一个秘密共享方案. 文献[7]利用纠错码巧妙构造了一个秘密共享门限方案,该方案是一个(l,t+l)门限秘密共享方案,可以共享多个秘密.
任何在实际中应用的密码方案及其算法都应该具有抵抗攻击的能力,Shamir秘密共享方案[1]和其他秘密共享方案是在秘密分发者和参与者都可信的前提假设下设计的,这样就导致了秘密共享方案在实际应用场景中存在很多安全隐患. 例如内部的参与者为了获得其他参与者的份额而提供假的份额;或者由于受信道中噪音的干扰等导致份额在通信过程中出现错误;又或者外部攻击者冒充授权的参与者进行欺诈;另外,秘密分发者也可能存在欺诈行为. 这些情况都会导致秘密无法重构或者重构的秘密错误. 为了解决这些问题,许多学者提出了可验证的秘密共享方案.
1985年,文献[8]提出了可验证秘密共享(verifiable secret sharing,VSS)的概念,其方法是在通常的秘密共享方案中添加一个验证算法,这样份额持有者就能验证自己的份额与分发者分发的份额是否一致. 验证方式有交互式和非交互式两种. 随后,其他研究者提出了一系列的可验证的秘密共享方案,文献[9]构造了一个非交互式的VSS方案. 在VSS方案的基础之上,文献[10]提出了可公开验证秘密共享(publicly verifiable secret sharing,PVSS)的思想,不仅仅内部参与者可以验证份额的有效性,非参与者也可以验证. 1999年,文献[11]设计了一个更完善的非交互的PVSS方案,方案中有两次非交互验证. 第一次是验证秘密分发者分发的加密的秘密份额,第二次是验证参与者解密后的秘密份额;前者可以预防秘密分发者的欺骗行为和通信中的错误,后者可以防止参与者之间的欺诈行为. 这样确保了秘密份额的有效性,避免了由于份额错误而产生不必要的计算. 本文也采用两次验证的思想.
在秘密共享中另外一个需要着重考虑的问题就是方案的效率,主要考虑数据传输量和计算量. 若秘密分发者和参与者之间使用一次一密的方式共享秘密,虽然安全性得以保证,但是在效率和成本上都有欠缺. 例如在Shamir门限方案中,参与者重构一次秘密之后,若要共享新的秘密,分发者就必须重新设置参数、给参与者分发秘密份额,因为该方案中参与者持有的秘密份额是一次性的,不能重复使用,方案的效率较低.
为了提高秘密共享方案的效率,文献[12-13]提出了一个多阶段秘密共享方案,方案中的每个份额可以使用1次,但是在重构过程中要求参与者提供相应顺序的秘密份额,这在实际的应用有很大的局限性. 随后,文献[14]构造了克服了上述缺点的一个方案,参与者可以用同一个子秘密共享任意多个秘密,子秘密可使用任意多次,但该方案为防止秘密分发者欺诈,每个参与者需要运行多次模指数运算来验证,计算量非常大. 同时为了防止参与者之间的相互欺诈,方案采用交互式验证方式. 针对上述缺陷,文献[15]提出一个新的方案,但在该方案中,对每一个共享秘密,秘密分发者除了要计算秘密份额外,还需要利用各参与者的子秘密计算一个验证向量,而向量的每一个分量都是模指数运算,因而秘密分发者计算压力很大. 文献[16]在门限秘密共享和RSA数字签名的基础之上,提出了门限多重秘密共享方案,但是该方案需要将子秘密通过秘密信道发送给参与者,在动态秘密共享情形下,秘密共享者的工作量较大,同时维护秘密信道增加了通信开支. 本文提出了一个安全有效的可公开验证的(t,n)多重秘密共享门限方案. 方案加密采用ElGamal公钥密码体制[17],不需要维护秘密信道而增加通信成本;计算的验证参数可以多次利用,Dealer要想共享新的秘密,只需要在公告牌上发布新的数据即可,Dealer的计算量较小,具有广泛的适用性.
全文HTML
-
定义 1(拉格朗日插值多项式) 设(x0,y0),(x1,y1),…,(xt-1,yt-1)是二维平面上任意给定的t个点的坐标,则有且仅有一个与这t个点的坐标对应的t-1次多项式p(x),满足p(xi)=yi,0≤i<t.
p(x)可以通过下面的公式计算得到:
身份识别的目的是使某人的身份被确认. 下面介绍Schnorr身份认证方案,该方案需要一个可信第三方发放证书和选择系统参数.
定义 2(Schnorr身份认证方案) 设p是一个大素数,α是Zp*中的一个元素,阶q>2t,t是安全参数,则对任意的β∈〈α〉,有0≤logαβ≤q-1,参数p,q,α,t是公开的. 系统中的每个用户选择自己的私钥a,0≤a≤q-1,并计算相应的公钥ν=α-amodp.
(i) Alice随机选择一个整数k,0≤k≤q-1,计算γ=αkmodp. Alice传送CretAlice和γ给Bob.
(ii) Bob利用证书CretAlice验证Alice的公钥ν. Bob随机选择一个整数r,1≤r≤2t,并传送r给Alice.
(iii) Alice计算y=k+armodq,并传送y给Bob.
(iv) Bob验证y≡αyνrmodp. 如果成立,Bob“接受”;否则,Bob“拒绝”.
下面的同余式成立说明Alice能够向Bob证明自己的身份
在上述的方案中需要证明者和验证者交互才能证实证明者的身份,显然满足不了本文所构造方案中非交互身份认证的需求,因此建立了一个非交互的身份认证方案.
定义 2(非交互身份认证方案) 设p是一个大素数,g1,g2是Zp的两个生成元,hash()是一个安全的密码学Hash函数. 假设某证明者拥有私钥α,记h1=g1α,h2=g2α.
(i) 证明者任选w∈RZq,然后计算a1=g1w,a2=g2w,c=hash(h1,h2,a1,a2),r=w-cαmodq;
(ii) 证明者用(c,r)应答;
(iii) 验证者计算a1=g1rh1c和a2=g2rh2c,c′=hash(h1,h2,a1,a2). 检查c=c′是否成立.
验证通过,则证明者拥有私钥α,使得h1=g1α,h2=g2α成立.
-
设P={P1,P2,…,Pn}是n个参与者的集合,Dealer是秘密分发者. 该方案在系统中需要一个公告牌,只有Dealer可以修改、更新公告牌上的内容,其他人只能阅读和下载. hash()是一个安全的密码学Hash函数.
方案运行前做以下准备工作,设g是q阶群Gq的生成元,q是一个素数,使得在Zq*上的离散对数问题是难解的. 参与者Pi选择自己的私钥xi∈RZq*(xi互不相同),并在系统中注册yi=gximodq作为自己的公钥,i=1,2,…,n.
-
1) 秘密份额分发
(i) Dealer选择一个t-1次的多项式
Dealer保存p(x),在公告牌上发布相关系数Ci=gαimodq,i=0,1,…,t-1.
(ii) Dealer计算份额Yi=yip(i)modq,设
${{X}_{i}}=\prod\limits_{j=1}^{t-1}{C_{j}^{{{i}^{j}}}}\bmod q$ . Dealer要为每一个p(i)产生一个承诺,满足Xi=gp(i)modq,Yi=yip(i)modq,i=1,2,…,n. 承诺中包含挑战ci和应答ri以及子秘密密文di,具体步骤如下:Dealer选取wi∈R Zq,计算a1i=gwimodq,a2i=yiwimodq,ci=hash(Xi,Yi,a1i,a2i),ri=(wi-cip(i))modq,di=p(i)a2imodq. Dealer在公告牌上发布Yi及其对应的承诺(ci,ri,di),i=1,2,…,n.2) 秘密份额的验证
验证者运行非交互式认证协议. 验证者首先计算
${{X}_{i}}=\prod\limits_{j=1}^{t-1}{C_{j}^{{{i}^{j}}}}\bmod q$ ,然后以g,Xi,yi,Yi,ci,ri为输入,计算a1i=griXicimodq,a2i=yiriYicimodq,接下来检验ci′=hash(Xi,Yi,a1i,a2i)是否与承诺ci相等. 若相等,接收;否则,拒绝. -
设K={K1,K2,…,Kr}是共享的秘密集,Dealer随机选取mj∈R Zq*,j=1,2,…,r,其中mj和Kj对应. 为了使n个参与者中任意t个及t个以上的参与者能够重构Kj,Dealer计算Tj=(Kj-mjlα0)modq,其中l=n!. Dealer在公告牌上公布(Tj,mj).
-
1) 秘密份额解密
不失一般性,假设一个最小授权子集A={P1,P2,…,Pt}. Pi验证Yi对应的承诺通过之后,计算a1i与di的乘积即可得到p(i). 因为a1i=gwimodq,di=p(i)a2imodq,a2i=yiwimodq,yi=gximodq,所以
然后计算Sij=mjp(i)modq. 此时有gp(i)=Ximodq,mjp(i)=Sijmodq,Pi对解密得到的Sij产生一个承诺,具体步骤如下:Pi随机选取vi∈R Zq,计算b1i=gvimodq,a2i=mjvimodq,ei=hash(yi,Sij,b1i,b2i),μi=(vi-eip(i))modq. Pi把(mj,Sij)及其对应的承诺(ei,μi),i=1,2,…,t,发送给指定解密者B,解密者可以是系统中的某个参与者,也可以是其他人.
2) 联合解密
解密者B要对收到可行集合A中参与者发送的秘密份额进行验证. 首先,以g,Xi,mj,Sij,ei,μi为输入,计算b1i=gμiXieimodq,b2i=mjμiSijeimodq,然后检验ei′=hash(g,Sij,b1i,b2i)是否与承诺中的ei相等,i=1,2,…,t. 若相等,接收;否则,拒绝并停止解密. 若验证都通过,B利用收到的解密份额恢复秘密:取l=n!,在整数环Z上计算拉格朗日系数
B可以计算
从而Kj=(Tj-mjlα0)modq,j=1,2,…,r. 若Dealer想在参与者集P中共享新的秘密Kr+1,则只需要重新选择mr+1∈R Zq*,计算Tr+1=Kr+1-mr+1lα0,在公告牌上发布(Tr+1,mr+1)即可.
2.1. 秘密分发阶段
2.2. 秘密生成阶段
2.3. 秘密重构阶段
-
Shamir门限方案共享一次秘密之后就会暴露插值多项式的系数,因此不能继续使用该多项式共享新的秘密. 若Dealer要共享新的秘密,则只能重新构造多项式. 一个直观的思想就是隐藏插值多项式的系数,本方案采用的思想是找一个计算离散对数困难的群Zq*,计算参数Ci=gαi,而攻击者在知道g和Ci的情况下是无法计算插值系数αi的. 下面通过两个定理来证明本方案是安全的.
定理 1 攻击者无法从Yi或Sij中计算得到p(i).
证 在本方案中,p(i)非常重要,需要每个参与者秘密保存. Yi=gp(i)modq,Sij=mjp(i)modq,而在Zq*中计算离散对数是困难的,所以攻击者无法从Yi或Sij中计算得到p(i).
定理 2 若参与者数量少于门限值t则不能从Tj,mj得到共享秘密Kj.
证 根据计算公式Tj=Kj-mjlα0可知,若要计算Kj,则先要计算mjlα0. 不失一般性,设1≤j≤t-1
而p(i)是一个t-1次多项式,需要t个点才能确定p(i),所以若参与者数量少于t则无法从Tj,mj得到共享秘密Kj.
在解密的过程中,没有直接用到p(i),也无法从解密参数中获取p(i),可以保证p(x)安全,所以可以用设定的参数安全共享多个秘密.
-
本文构造了一个可公开验证的门限多重秘密共享方案.
该方案基于拉格朗日插值多项式,且采用两次非交互的验证协议,第一次验证是为了防止Dealer作弊或信息在传递过程中受到信道中噪音的干扰而出现错误;第二次验证是检测参与解密的参与者提供的秘密份额是否为Dealer发送. 只有通过两次验证的秘密份额才能作为重构秘密的份额.
共享多个秘密的思想是将秘密和一个随机参数作二进制加法隐藏起来,只有达到或超过门限值个数的参与者联合才能计算得到这个随机参数. 共享新的秘密只需选择新的参数,因此可以共享任意多个秘密.
本文所构造的方案是将可公开验证和可共享多个秘密这两个优点相结合,是对秘密共享作了进一步研究.