原理:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。
关于定义中循环群、生成元等基础概念的理解可以看上一篇文章整理
https://blog.csdn.net/sLiubala/article/details/105952656
ElGamal加密算法三部分:
密钥生成、加密、解密
-
密钥生成
利用生成元g产生一个q阶循环群G
从{1,…q-1}中随机选择一个x, h = g x h=g^x h=gx
则(G,q,g,h)将作为公钥,而x作为私钥,私钥保密。 -
加密
发送方根据接收方的公钥(G,q,g,h)给她发送一条加密信息m的加密算法工作方式如下:
发送方2.1首先从{1,…q-1}中随机选择一个y,计算 c 1 = g y c_1=g^y c1=gy
2.2 计算共享秘密 s = h y s=h^y s=hy
2.3 发送方把他要发送的秘密消息m映射为G上的一个元素m’
2.4 计算 c 2 = m ′ ∗ s c_2= m' * s c2=m′∗s
2.5 发送方将密文 ( C 1 , C 2 ) = ( g y , m ′ ∗ h y ) = ( g y , m ′ ∗ ( g x ) y ) (C_1,C_2)=(g^y,m' * h^y)=(g^y,m' * (g^x) ^y) (C1,C2)=(gy,m′∗hy)=(gy,m′∗(gx)y)发送给接收方。
值得注意的是,如果一个人知道了m’,那么它很容易就能知道 h y h^y hy的值,因此对每一条信息都产生一个新的y可以提高安全性。 -
解密
利用私钥x对密文 ( c 1 , c 2 ) (c_1,c_2) (c1,c2)进行解密的算法工作方式如下:
接收方3.1计算共享秘密 s = c 1 x s= c_1^x s=c1x
3.2 计算 m ′ = c 2 ∗ s − 1 m' = c_2 * s ^{-1} m′=c2∗s−1,并将其映射回明文m,其中 s − 1 s^-1 s−1是s在群G上的逆元。(如果G是整数模n乘法群的的一个子群,那么逆元就是模逆元)
计算过程:
c 2 ∗ s − 1 = m ′ ∗ h y ∗ ( g x y ) − 1 = m ′ ∗ g x y ∗ g − x y = m ′ c_2 * s^{-1}= m' * h^y * (g^{xy})^{-1}= m' *g^{xy} * g^{-xy}=m' c2∗s−1=m′∗hy∗(gxy)−1=m′∗gxy∗g−xy=m′
这样Elgamal加密解密算法就完成啦。