密码学基础(九) - 公钥加密中的高等概念

陷门置换构造加密方案

陷门置换(Trapdoor Permutation)是公钥加密体制中的一种抽象概念,
在一些结构中,参数生成算法Gen输出一些附加信息t和I,从而实现fI的有效求逆。称这些附加信息为陷门(trapdoor),并将单向置换的族称为陷门置换的附加属性族。
陷门的形式化定义为:
一组多项式时间算法(Gen,Samp,f,Inv)如果满足以下条件则称其为陷门:

  • 概率性的参数生成算法Gen:输入1n,输出(I,td)其中|I| n,I的每一个值定义了一个置换的定义域和值域DIfI:DIDI
  • Gen1表示由Gen算法生成的结果,并且只输出I。则(Gen1,Samp,f)是一族单向置换
  • (I,td)表示Gen(1n)的输出,则确定性的反向算法Inv,将td以及y DI作为输入,然后输出x DI,表示成x := Invtd(y)。则需要保证所有由Gen(1n)生成的(I,td),有一个概率均匀的选择x DI,有Invtd(fI(x))=x

也就是对陷门置换fI,如果未知陷门td,则很难求fI的逆;如果已知陷门td,则能够高效率的求fI的逆。

陷门置换构造的公钥加密方案:设Π=(Gen,f,Inv)是一族陷门置换,令hc为一个确定性的多项式时间算法,这个算法接收I以及xDI作为输入,然后输出一个比特hcI(x),称hc为Π的硬核谓词,如果对于所有PPT上的算法A,存在一个可忽略函数negl满足Pr[A(I,fI(x))=hcI(x)]12+negl(n)

陷门置换的不对称性意味着任何一个知道与I相关的陷门td的人而可以从fI(x)中恢复出x,并由此从fI(x)计算出hcI(x)
但是如果只给了一个I,对于一个概率均匀选择的x,很难从fI(x)计算出hcI(x)

从任何一组陷门置换构造公钥加密方案:设Π=(Gen',f,Inv)是一族陷门置换,其硬核谓词为hc,则可以构造一个公钥加密方案如下:

  • Gen:输入安全参数1n,运行Gen'(1n)获得(I,td),输出公钥I,私钥td
  • Enc:输入一个公钥I以及一条明文m {0,1},概率均匀的选择一个r DI,r满足hcI(r)=m,输出密文c := fI(r)
  • Dec:输入一个私钥td以及一条密文c,计算r:=InvI(c),然后输出明文m := hcI(r)

定理:如果Π是一族硬核谓词为hc的陷门置换,那么上面所构造的加密方案是CPA安全的
加密更长的明文:在前面的RSA-lsb中已经介绍过如何利用加密单比特明文的加密方案加密更长的明文

秘密共享以及门限加密

安全(交互)协议可能比基本的密码原语(例如,加密和签名方案)复杂得多。一方面是因为它们可能涉及多方交换几轮消息,另一方面是因为它们旨在实现更复杂的安全需求。

秘密共享

应用情景:一个发牌员持有一个秘密(比如核弹的发射密码),希望通过给与每个用于一点份额在用户集合P1,...,PN之间共享这个秘密,任意t个用户都能通过将他们的份额组装起来从而恢复这个秘密,但是用户数量小于t则无法知道任何关于这个秘密的信息
上述的应用情景称为(t,N)门限秘密共享,而(t,N)门限秘密共享有有两种情况,t=N,以及t<N的情况:

  • t=N的情况:
    假设秘密信息 s{0,1}l

    1. 发牌员概率均匀的选择s1,...,sN1{0,1}l,然后计算sN:=s(i=1N1si),则每个用户的份额就是si,i=1,...,N
    2. 因为(i=1Nsi)=s,当N个用户都提供了自己的份额后能够恢复秘密信息s
    3. 并且,当用户数量少于N的时候,无法获得任何关于秘密s的信息
  • t<N的情况,与上面那种情况不同的是,在选择s1,...,sN的时候需要满足一定的约束,并且显然效率是很低的。主要由Shamir秘密共享算法实现。

Shamir秘密共享方案:这个方案是基于一个有限多项式域F设计的,其中F满足秘密sF 并且|F|>N,其原理主要是:给定k个点,能够确定唯一的多项式f,满足degf=k1
即,给定F中任意t个不重复的点,(x1,y1),...,(xt,yt),都有一个唯一的多项式p满足p(xi)=yi,degf=(t1)

该方案的工作原理如下,设x1,...,xNF,没有重复并且不含零元素,这些信息是可以公开的:

  • 共享:给定一个秘密sF,发牌员均匀随机的选择a1,...,at1F,然后定义一个多项式p(X)=s+Σi=1t1aiXi,每个用户的秘密份额为si=p(xi)F
  • 恢复:t个用户P1,...,Pt交出他们的份额s1,...,st然后利用p(xi)=si计算出多项式多项式p,则秘密为s=p(0)。而且显然,对于任何用户数量小于t的用户都无法计算出p,也就无法获取任何关于秘密s的信息

Example:N=4,t=2,以及x1=1,x2=2,x3=3,x4=4,秘密s=64,则Shamir秘密共享算法:
构造多项式:随机选取整数a=14,则p(x)=64+14x
共享份额:s1=p(x1)=64+14=78s2=p(x2)=92s3=p(x3)=106s4=p(x4)=120
恢复秘密:显然,任意两个点(xi,si)都能够恢复多项式p(x)=64+14x,而秘密信息s=p(0)=64

可验证秘密共享

在秘密共享方案中存在着两种恶意行为,而可验证秘密共享(Verifiable Secret Sharing,VSS)用于抵抗这两种恶意行为

  1. 腐败的发牌员:给用户发放不一致的份额,这样会导致不同的用户组会恢复出不同的秘密
  2. 在恢复阶段中一个恶意的用户可能会提交一个假的份额,从而影响恢复过程

更加形式化的定义是,可验证秘密共享方案需要满足以下两个条件:如果用户集合中有t-1个腐败的用户,并且相互串通,甚至其中可能包括发牌员,则:

  1. 在共享阶段结束的时候,需要保证任何t个份额都能够会付出秘密s
  2. 如果发牌员是诚实的,那么秘密就是发牌员的密钥

当然上面的第一个条件是假设用户集合中的大多数( t个)用户是不腐败的,那么N应该满足N t+t-1 > 2(t-1)

可验证秘密共享方案:设H是一个由随机预言机构造的函数,假设由G(1n)生成的可信任参数(G,q,g)是提前发表了的,其中q是一个素数,所以Zq是一个域,并且所有用户都可以访问广播频道

  • 共享阶段:
    1. 设将要分享的秘密为s,则发牌员概率均匀的选择一个a0Zq,然后利用Shamir秘密共享方案共享a0,将si=p(i)=Σj=0t1aiij发送给用户Pi,此外,发牌员利用广播频道广播A0=ga0,...,At1=gat1,以及“被掩盖的秘密”c := H(a0) s
    2. 每个用户Pi在收到了自己的份额后需要验证gsi=?j=0t1(Aj)ij,如果不满足,则在广播频道上报错
      j=0t1(Aj)ij=j=0t1(gai)ij=gΣj=0t1aj·ij=gp(i)=gsi
    3. 如果有超过t-1个用户报错,则发牌员不合格,协议终止;否则,发牌员广播si作为回应;如果广播出去的份额仍然无法通过验证,则这个发牌员是不合格的,协议终止;否则,用户Pi将广播的si作为自己的份额
  • 恢复阶段:在恢复之前需要先进行验证,如果用户组中的用户Pi不能通过验证,那么这个用户将被丢弃,而在这剩下的t个通过验证的用户中,可以恢复出a0,然后计算s:=cH(a0)

电子选举

这种技术依赖于El-Gamal加密方案的一种变体的同态加密方案:给定公钥pk=(G,q,g,h),如果要加密明文mZq,则计算M=gm,概率均匀的选择一个yZq,然后发送密文c=(gy,hy·M);如果要解密,想用标准的El-Gamal加密方案计算出M,然后计算m=loggM

  • 缺点:如果明文空间比较大,那么效率将会非常低;如果明文空间比较小,那么接收方可以使用穷举搜索高效的解密
  • 优点:对于Zq中的加法同态:(gy1,hy1·gm1)·(gy2,hy2·gm2)=(gy1+y2,hy1+y2·gm1+m2)

使用同态加密进行电子选举的基本方法是让每个投票者对其投票vi{0,1}进行加密,从而获得一个密文ci。收集所有人的密钥,然后将所有的密文相乘,从而得到最终投票结构的密文,称为最终密文,然后将私钥发送到权威机构进行解密,从而获取投票的总和

然而存在着一个缺陷:权威机构必须是可信的,否则,其既可以(正确地)解密最终的密文,也可以不解密任何个别选民的密文而作弊。

解决的方法是同时委托多个机构,然后利用秘密共享将私钥分享给这些机构
不过仍然存在着一个缺陷:如果权威机构为了解密某个密文而恢复这个私钥,那么所有的机构都会知道这个私钥,那么他们可以按照自己选择解密任何密文。

posted @   2hYan9  阅读(1701)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示