在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法,它在1985年由塔希尔·盖莫尔提出 。
EIGamal公开密钥密码体制是基于有限域中离散对数间题的难解性。它所根据的原理是:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。在相应的群 G中,指数函数是单向函数,所谓单向函数它的意义就是在有限的算力之下如果你希望逆向去求的话是不可能做到的
三个部分,分为秘钥生成,加密以及解密
核心加密解密成分就是通过 ( 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} c2⋅s−1=m′⋅hy⋅(gxy)−1=m′⋅gxy⋅g−xy=m′
首先利用生成元 g g g产生一个 q q q阶循环群 G G G的有效描述,然后计算出辅助系数,私钥,公钥
辅助系数:
公钥:公开h以及G,q,g的描述作为其公钥
私钥:保留x作为其私钥
最终的密文: ( 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,m′⋅hy)=(gy,m′⋅(gx)y)
可以看出这里主要c1和c2就是最终要解密的两个部分c1*某一式子=c2,所以将有的 g x g^x gx和 h y = g x y h^y=g^{xy} hy=gxy其中任意一个和信息结合,那么最终只需要知道c1和c2和对应私钥x就能够求得信息,因为你有没有发现它就缺一个私钥x
在加密的过程中已经讲的相当明显了,通过c1和c2还有x一起进行解密,解密公式如下:
s = c 1 x s=c_1^x s=c1x
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} c2⋅s−1=m′⋅hy⋅(gxy)−1=m′⋅gxy⋅g−xy=m′
在使用EIGamal加密算法时,模运算是实现公钥密码加解密运算速度的关键,如何提出并实现一个有效的大整数幂模运算算法是实现公钥密码体制的关键;
所有使用者可以选取使用同样的素数 p 和生成元,在这种情况下,p不必作为公钥的一部分而发布,这可使公钥的长度小一些。使用固定元素还有另外的优点:可以通过预计算来加快取幂运算,但使用共同系统参数一个潜在的缺点是必须保证模 p足够大
选取一个大的素数p,g是 G F ( p ) GF(p) GF(p)的生成元。h:GF§→GF§,是一个单向Hash函数。
系统将参数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=yr⋅gk⋅(k1(m−x⋅gk))=yr⋅rs
最终的签名信息发送: ( m , r , s ) (m,r,s) (m,r,s)。下面是 r , s r,s r,s的意义:
这里的k只是从 { 1 , 2 , . . . , q − 1 } \{1,2,...,q-1\} {1,2,...,q−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=gx⋅r⋅_=gx⋅gk⋅_
那么通过上式就可以得到: _ = g m − x ⋅ g k \_ = {g^{m - x \cdot {g^k}}} _=gm−x⋅gk
将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(k⋅k1)(m−x⋅gk),也就是 _ = g k ⋅ ( 1 k ( m − x ⋅ g k ) ) \_ = {g^{k \cdot (\frac{1}{k}(m - x \cdot {g^k}))}} _=gk⋅(k1(m−x⋅gk)),可以看出s就是k后面那一长串 k − 1 ( m − x r ) m o d p k^{-1}(m-x r) \bmod p k−1(m−xr)modp
通过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=yr⋅gk⋅(k1(m−x⋅gk))=yr⋅rs
那么只要验证左右两边相等就行
通过幂算法提出了通用的加密方案和签名方案
1.Elgamal百度百科