密码协议学习笔记(8.2):门限密码学

门限密码学的背景和概念:

门限密码学的思想基于秘密分享,即使用秘密分享方法将基本的公钥密码体系分布于若干参与者之间.

门限密码学包括门限加密和门限签名.

门限加密:

直接将密钥作为秘密,以秘密分享体系分享给参与者不失为一种方案,但这样会带来几个问题:

  1. 分发者知道密钥,不可信的分发者可能会盗用密钥
  2. 参与重构的成员因为得到了密钥,因此也可能在未经允许的情况下盗用密钥

为避免此类问题,给出如下的门限加密的定义:

  1. 分布式密钥生成:

    P1,P2,,Pn运行的生成公钥h的协议

    协议运行结束后,每个参与者获得

    1. 私钥x的碎片xi,

    2. 对应该碎片的碎片验证公钥hi,

    3. 与私钥x相对应的公钥h

  2. 加密算法:

    输入:公钥h,明文m

    输出:密文c

  3. 门限解密:

    由任意t个参与者,不妨设为P1,P2,,Pt运行的协议

    输入:

    1. 密文c,
    2. t个私钥碎片x1,x2,,xt,
    3. 碎片验证公钥h1,h2,,ht

    输出:明文m

对于成员数为n,门限值为t的门限密码协议,其不依赖任何特殊的可信方,其基本要求是,私钥x总是保密的,除非不少于t个参与者泄露了自己的秘密碎片.

门限ElGamal密码体系:

系统参数:

大素数p

Gp阶循环群

gG的生成元

参与者数量为n,门限值为t

分布式密钥生成:

该步骤的目标是由P1,P2,,Pn共同生成生成公共公钥h,再各自生成自己的私钥碎片xi和用于验证私钥碎片的碎片验证公钥hi

参与者Pi进行如下的工作:

  1. 随机生成多项式fi(x)=α(i,0)+α(i,1)x+α(i,2)x2++α(i,t1)xt1并记Si=α(i,0)
  2. gSi发送给其他参与者.
  3. 收到其他参与者发来的gS1,gS2,,gSi1,gSi+1,,gSn后,计算并发布h=Πj=1ngSj作为公共公钥.
  4. 以秘密分发者的身份执行Feldman的VSS方案(回顾密码协议学习笔记(8.1):秘密分享 - Isakovsky - 博客园 (cnblogs.com)),在P1,P2,,Pn之间分享秘密Si,记Pj得到的关于Si的碎片是s(ij)=fi(j)
  5. 将自己收到的碎片相加,就得到自己关于私钥x私钥碎片xi=Σj=1ns(j,i)
  6. 计算自己的碎片验证公钥hi=gxi

加密:

收到公共公钥h并意图向参与者们P1,P2,,Pn所代表的组织发送信息m的人,其工作和和ElGamal加密体系类似,

  1. 随机选取k[1,p1]
  2. 计算a=gk
  3. 计算b=mhk
  4. (a,b)作为密文发送

门限解密:

收到消息(a,b)后,任意t个参与者,不妨记为P1,P2,,Pt可进行解密

参与者Pi的工作如下:

  1. 使用自己的私钥碎片xi计算di=axi并发送给其他人
  2. 生成一个知识证据PROOFi以证明自己使用了正确的xi计算出了di,即xi使得di=axi,hi=gxi同时成立,生成的方式可参考密码协议学习笔记(8.15):知识证据 - Isakovsky - 博客园 (cnblogs.com)
  3. 收到其他人发来的dj后,使用PROOFj验证dj的有效性
  4. 计算如下式子以恢复明文m=bΠi=1tdiλi其中λi=Πj=1,2,,i1,i+1,,tjji为Lagrange插值系数.

正确性证明:

m=bΠi=1tdiλi=mhkΠi=1t(axi)λi=mhkaΣi=1txiλi=mhkaΣi=1t(Σj=1nfj(i))λi=mhkaΣj=1nΣi=1tfj(i)λi=mhkaΣj=1nfj(0)=mhkaΣj=1nSi=mhk(gk)Σj=1nSi=mhkhk=m

可以看出,即使在门限解密环节,私钥x也未被直接计算出来,这防止了经手私钥的人暗中保存并在之后滥用.

门限签名:

定义:成员数为n,门限值为t的门限签名是由以下三个协议构成的体系:

  1. 密钥生成协议:

    各参与者P1,P2,,Pn协作运行的协议.

    协议结束时,参与者Pi获得私钥x的碎片xi,公钥y公开发布

  2. 签名生成协议:

    至少t个参与者,不妨记为P1,P2,,Pt协作运行的协议

    公开输入为待签名信息m和公钥y

    公开输出为签名σ=Sign(m,x)

  3. 签名验证算法:

    与通常的签名验证算法完全一致

门限RSA签名协议:

系统参数:

参与者数量为n,门限值为t

碎片分发:

分发者做如下工作以生成并分发密钥碎片:

  1. 选取大质数p,q,计算n=pq,φ(n)=(p1)(q1)
  2. 选取e(max(p,q),φ(n)),计算d=e1modφ(n)
  3. 使用Shamir秘密分享方案生成d的碎片d1,d2,,dn并分发给成员P1,P2,,Pn
  4. 随机生成t1,t2,,tn[1,p1],计算碎片验证公钥h1,h2,,hn,hi=tidi,然后将(t1,h1),(t2,h2),,(tn,hn)公开.
  5. (n,e)作为公钥公开.
  6. 由于正常运行协议时,参与者不应知道φ(n)的值,因此需预先计算出模φ(n)下的Lagrange插值系数λ1,λ2,,λt供参与者使用λi=Πj=1,2,,i1,i+1,,njjimodφ(n)另,由于i,jnmin(p,q),所以i,j,gcd(ji,φ(n))=1,故(ji)的模φ(n)逆元必然存在.

分布式签名:

对于待签名信息m,t个参与者,不妨记为P1,P2,,Pt协作运行此算法,生成签名σ

Pi的工作如下:

  1. 计算si=mdi
  2. 生成知识证据PROOFi以证明logmsi=logtihi,和si一同发送给其他参与者.
  3. 通过知识证据验证其他人发来的sj的有效性
  4. 计算σ=Πj=1t(sj)λj作为签名.

实际上,

σ=Πj=1t(sj)λj=Πj=1t(mdj)λj=mΣj=1tdjλj=md

签名验证:

和一般的RSA签名算法验证方式一样,验证者计算σe并判断其值和m是否相等.

 

posted @   Isakovsky  阅读(983)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-10-09 2019ccpc秦皇岛/Gym102361 I - Invoker dp
2019-10-09 2019ccpc秦皇岛/Gym102361 D - Decimal 签到
2019-10-09 2019ccpc秦皇岛/Gym102361 F Forest Program 仙人掌上dfs
点击右上角即可分享
微信分享提示