深入浅出——Elgamal非对称加密算法

1. 背景

在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法,它在1985年由塔希尔·盖莫尔提出 。
EIGamal公开密钥密码体制是基于有限域中离散对数间题的难解性。它所根据的原理是:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。在相应的群 G中,指数函数是单向函数,所谓单向函数它的意义就是在有限的算力之下如果你希望逆向去求的话是不可能做到的

2. 加密方案

三个部分,分为秘钥生成,加密以及解密

核心加密解密成分就是通过 ( g x ) y = ( g y ) x = g x y {({g^x})^y} = {({g^y})^x} = {g^{xy}} (gx)y=(gy)x=gxy

核心解密方程式 c 2 ⋅ s − 1 = m ′ ⋅ h y ⋅ ( g x y ) − 1 = m ′ ⋅ g x y ⋅ g − x y = m ′ c_{2} \cdot s^{-1}=m^{\prime} \cdot h^{y} \cdot\left(g^{x y}\right)^{-1}=m^{\prime} \cdot g^{x y} \cdot g^{-x y}=m^{\prime} c2s1=mhy(gxy)1=mgxygxy=m

2.1 秘钥生成

首先利用生成元 g g g产生一个 q q q阶循环群 G G G的有效描述,然后计算出辅助系数,私钥,公钥

辅助系数:

  1. { 1 , 2 , . . . , q − 1 } \{1,2,...,q-1\} {1,2,...,q1} 中随机选择一个 x x x;
  2. 通过 x x x计算 h = g x h=g^x h=gx,之所以是这个辅助系数,可以从我们上面提到的核心加密解密成分就知道了 ( g x ) y = ( g y ) x = g x y {({g^x})^y} = {({g^y})^x} = {g^{xy}} (gx)y=(gy)x=gxy,它就是核心成分的组成部分;

公钥:公开h以及G,q,g的描述作为其公钥

私钥:保留x作为其私钥

2.2 加密

最终的密文: ( c 1 , c 2 ) = ( g y , m ′ ⋅ h y ) = ( g y , m ′ ⋅ ( g x ) y ) \left(c_{1}, c_{2}\right)=\left(g^{y}, m^{\prime} \cdot h^{y}\right)=\left(g^{y}, m^{\prime} \cdot\left(g^{x}\right)^{y}\right) (c1,c2)=(gy,mhy)=(gy,m(gx)y)

  • 其中 m ′ m^{'} m就是信息经过映射最终落在了GF§中的

可以看出这里主要c1和c2就是最终要解密的两个部分c1*某一式子=c2,所以将有的 g x g^x gx h y = g x y h^y=g^{xy} hy=gxy其中任意一个和信息结合,那么最终只需要知道c1和c2和对应私钥x就能够求得信息,因为你有没有发现它就缺一个私钥x

2.3 解密

在加密的过程中已经讲的相当明显了,通过c1和c2还有x一起进行解密,解密公式如下:

  1. s = c 1 x s=c_1^x s=c1x

  2. c 2 ⋅ s − 1 = m ′ ⋅ h y ⋅ ( g x y ) − 1 = m ′ ⋅ g x y ⋅ g − x y = m ′ c_{2} \cdot s^{-1}=m^{\prime} \cdot h^{y} \cdot\left(g^{x y}\right)^{-1}=m^{\prime} \cdot g^{x y} \cdot g^{-x y}=m^{\prime} c2s1=mhy(gxy)1=mgxygxy=m

2.4 总结

  1. 在使用EIGamal加密算法时,模运算是实现公钥密码加解密运算速度的关键,如何提出并实现一个有效的大整数幂模运算算法是实现公钥密码体制的关键

  2. 所有使用者可以选取使用同样的素数 p 和生成元,在这种情况下,p不必作为公钥的一部分而发布,这可使公钥的长度小一些。使用固定元素还有另外的优点:可以通过预计算来加快取幂运算,但使用共同系统参数一个潜在的缺点是必须保证模 p足够大

3. 签名认证方案

3.1 秘钥生成(初始化)

  1. 选取一个大的素数p,g是 G F ( p ) GF(p) GF(p)的生成元。h:GF§→GF§,是一个单向Hash函数。

  2. 系统将参数p、g和h存放于公用的文件中,在系统中的每一个用户都可以从公开的文件中获得上述参数

核心签名认证方程式 g m = y r ⋅ g k ⋅ ( 1 k ( m − x ⋅ g k ) ) = y r ⋅ r s {g^m}={y^r} \cdot {g^{k \cdot (\frac{1}{k}(m - x \cdot {g^k}))}}={y^r} \cdot r^s gm=yrgk(k1(mxgk))=yrrs

3.2 签名

最终的签名信息发送: ( m , r , s ) (m,r,s) (m,r,s)。下面是 r , s r,s r,s的意义:

  1. r = g k   m o d   p r=g^{k} \bmod p r=gkmodp
  2. s = k − 1 ( m − x r )   m o d   p s=k^{-1}(m-x r) \bmod p s=k1(mxr)modp

这里的k只是从 { 1 , 2 , . . . , q − 1 } \{1,2,...,q-1\} {1,2,...,q1}生成的一个随机数

3.2.1 如何将签名域验证结合

  1. g m = y r ⋅ _ = > g m = g x ⋅ r ⋅ _ = g x ⋅ g k ⋅ _ {g^m} = {y^r} \cdot \_ = > {g^m} = {g^{x \cdot r}} \cdot \_ = {g^{x \cdot {g^k}}} \cdot \_ gm=yr_=>gm=gxr_=gxgk_

  2. 那么通过上式就可以得到: _ = g m − x ⋅ g k \_ = {g^{m - x \cdot {g^k}}} _=gmxgk

  3. 将2与已有的 r = g k   m o d   p r=g^{k} \bmod p r=gkmodp进行结合,因为这里有同样的底数,所以我们可以得到 _ = g ( k ⋅ 1 k ) ( m − x ⋅ g k ) \_ = {g^{(k \cdot \frac{1}{k})(m - x \cdot {g^k})}} _=g(kk1)(mxgk),也就是 _ = g k ⋅ ( 1 k ( m − x ⋅ g k ) ) \_ = {g^{k \cdot (\frac{1}{k}(m - x \cdot {g^k}))}} _=gk(k1(mxgk)),可以看出s就是k后面那一长串 k − 1 ( m − x r )   m o d   p k^{-1}(m-x r) \bmod p k1(mxr)modp

3.3 验证

通过3.2.1中的3可以进行验证 g m = y r ⋅ g k ⋅ ( 1 k ( m − x ⋅ g k ) ) = y r ⋅ r s {g^m}={y^r} \cdot {g^{k \cdot (\frac{1}{k}(m - x \cdot {g^k}))}}={y^r} \cdot r^s gm=yrgk(k1(mxgk))=yrrs

那么只要验证左右两边相等就行

4. 总结

通过幂算法提出了通用的加密方案和签名方案

参考文章

1.Elgamal百度百科

你可能感兴趣的:(信息安全数学基础,论文精读)