Security Reduction学习笔记(2):预备知识(群环域,双线性配对,哈希函数)

省略部分可参考密码协议学习笔记(1.4):密码学的一些数学基础 - Isakovsky - 博客园 (cnblogs.com)

有限域:

F是有限个元素的集合

(F,+,)满足某些条件(条件略),则称其为有限域(Finite Field,或称Galois域)

其零元,单位元分别记为0F,1FF

F=F{0F}

uF,记其对+的逆元为u

uF,记其对的逆元为u1

q为素数时,两类特殊的有限域:

素数域(Fq,+,):

Zq={0,1,2,,q1}和模q的加法,乘法构成的有限域.

有限域(Fqn,+,):

该域上的元素形式为(x0,x1,,xn1),其中xiZq

容易看出其阶为qn

u=(u0,u1,,un1),v=(v0,v1,,vn1)Fqn

u+v=(u0+v0modq,u1+v1modq,,un1+vn1modq)

uv=(u0×v0modq,u1×v1modq,,un1×vn1modq)

0Fqn=(0,0,,0)

1Fqn=(1,1,,1)

u=(qu0,qu1,,qun1)

u1=((u0)q2modq,(u1)q2modq,,(un1)q2modq)

循环群:

定义:Abel群(交换群):

(H,)为Abel群,当且仅当满足以下条件:

  • 封闭性
  • 结合律
  • 存在恒等元eH
  • 对于每个元素uH均存在逆元u1
  • 交换律

xZ,hH,群上的幂运算按如下方式定义:

gx=gggx

定义:循环Abel群:

Abel群(H,)为循环Abel群,当且仅当满足以下额外条件:

存在(至少一个)生成元,记为h,以如下方式生成H

H={h1,h2,,h|H|}={h0,h1,,h|H1|}

定义:素数阶的循环Abel群(循环群):

若生成元gH,以 G={g1,g2,,g|G|}={g0,g1,,g|G1|}的方式生成子群G,且

  • |G|为质数
  • |G||H|的因数

则称G为素数阶的循环Abel群.

素数阶的循环Abel群简称循环群(Cyclic Group)

循环群G具有如下良好的性质:

  • G是最小子群(其子群只有自身)
  • g0以外,元素均为生成元
  • 可以容易地计算出逆元

要构造一个循环群,首先需要确定

  • 元素空间G
  • 生成元g
  • p

可以用(G,g,p)来描述一个群.

循环群上的计算复杂性问题:

密码系统的构建,需要依赖一些容易求解的问题和难求解的问题的配合.

首先规定,在之后的讨论中,|G|2160

循环群G上的幂运算是容易求解的,使用快速幂,需要进行的运算次数仅为O(log|G|).

但对于离散对数问题,求解并不是那么容易.

定义:循环群G上的离散对数问题

G上的恒等元为eG,G=G{eG}

gG,xZp,gx=h,记loggh=x,

给定任意gG,hG,称求解loggh的问题为离散对数问题.

对于任意循环群(G,g,p),求解离散对数问题的复杂度是Ω(p),这也就是为什么要规定|G|2160的原因.

(博主注:因为这样,G中的每个元素只需要160这个数量级的比特位存储,然而现代超算每秒运行次数也不超过1015,即使是2801023次运算也需要三年多,这个复杂度足够了.)

(博主注:离散对数的求解方法:BSGS算法,见求解离散对数的方法:BSGS - Isakovsky - 博客园 (cnblogs.com))

(博主注:但并非所有循环群上的离散对数问题都是难解的,例如在模素数p加法循环群([0,p1],+modp)上,求解loggh只需引入整数的普通乘法×,计算g的模p乘法逆元rev(g)=g×ggp2modp然后计算h×rev(g)modp=loggh即可.

可能不那么直观,不妨举个例子,在循环群([0,1000000006],+mod1000000007)上,幂运算的定义是gx=(g+g++g)xmod1000000007要求解log23只需使用整数的普通乘法×计算rev(2)=(2×2××2)1000000005mod1000000007=500000004然后计算3×rev(2)mod10000000007=500000005即为log23的值,实际上,2500000005=(2+2++2)500000005mod1000000007=3)

双线性配对:

密码协议学习笔记(2):密钥交换协议 - Isakovsky - 博客园 (cnblogs.com) 基于身份的密钥协商部分

哈希函数:

基于安全的分类:

  • 抗逆向哈希函数
  • 抗碰撞哈希函数

基于输出值的分类

  • 输出定长字符串H:{0,1}{0,1}n
  • 输出整数H:{0,1}Zp
  • 输出域上的元素H:{0,1}G

伪随机数发生器:

略.

不安全的密码系统的示例:

例1:

该系统中,私钥sk=αZp公钥pk=(g,gα)

明文m的签名σm=gαm

问题:已知(pk,m,σm),如何对另一串明文m伪造签名?

参考答案 计算(gα)m

例2:

该系统中,私钥sk=αZp公钥pk=(g,gα)

明文m的签名σm=gα+m

问题:已知(pk,m,σm),如何对另一串明文m伪造签名?

参考答案 计算gαgm

例3:

该系统中,私钥sk=(α,β)Zp公钥pk=(g,gα,gβ)

明文m的签名σm=α+mβmodp

问题:已知(pk,m1,σm1,m2,σm2),如何对另一串明文m3伪造签名?

参考答案:

计算(σm1σm2)1m1m2=(m1m2)β1m1m2=βmodp

σm1m1β=α+m1βm1β=αmodp

私钥已求出,直接伪造即可.

例4:

该系统中,私钥sk=(α,β)Zp公钥pk=(g,gα,gβ)

明文m的签名σm=(gαβ+mr,gr),其中rZp为随机数.

问题:已知(pk,m,σm),如何对另一串明文m伪造签名?

参考答案

计算

(gr)m=gmr

gmr=(gmr)1

gαβ=gαβ+mrgmr

随机生成rZp

然后将σm=(gαβ+mr,gr)作为伪造的签名

例5:

该系统中,私钥sk=(α,β)Zp公钥pk=(g,gα,gβ)

明文m的签名σm=(gαβ+mrβ,gr),其中rZp为随机数.

问题:已知(pk,m,σm),如何对另一串明文m伪造签名?

参考答案

参考:万剑振铜臭的动态-哔哩哔哩 (bilibili.com)

首先需要明确该密码方案的验证方法,验证中需要用到双线性映射e(,)

接收方收到消息m,签名σm=(gαβ+mrβ,gr)和公钥pk=(g,gα,gβ)后,计算

e(gα,gβ)e((gr)m,gβ)=e(g,g)αβe(g,g)mrβ=e(g,g)αβ+mrβ

然后计算

e(g,gαβ+mrβ)=e(g,g)αβ+mrβ

比较两者是否相等即可.

而对于已知消息消息m,签名σm=(gαβ+mrβ,gr)和公钥pk=(g,gα,gβ)后,对消息m伪造签名的方法如下

计算mZp上的逆元(m)1

计算gr=(grm)(m)1

以此法得出的gr拥有如下性质:grm=grm

这也意味着gαβ+mrβ=gαβ+rmβ

将已知的签名前半部分进行重放攻击,得到伪造签名σm=(gαβ+mrβ,gr)

例6:

该系统中,私钥sk=αZp公钥pk=(g,gα)

明文m的签名σm=g1αm

问题:已知(pk,m,σm),如何对另一串明文m伪造签名?

参考答案

计算m的逆元(m)1后与m相乘得到mm

然后计算

σm=(σm)mm=g1αmmm=g1αm

得到伪造签名.

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