加密过程

ElGamal加密方案是一种基于难解的离散对数问题的公钥加密系统。它由Taher Elgamal在1985年提出,用于提供数据的机密性和/或数字签名。

以下是ElGamal加密过程的基本步骤:

  1. 密钥生成

    • 选择一个大的随机质数pp和一个生成元gg(一个整数,其在模pp下的所有正幂能够生成模pp的所有非零余数)。
    • 选择一个随机整数xx,满足1<x<p11<x<p-1,作为私钥。
    • 计算y=gxmodpy=g^x \mod p,作为公钥。
    • 公开ppggyy,保密xx
  2. 加密过程

    • 对于要加密的明文mm,选择一个随机整数kk,满足1<k<p11<k<p-1
    • 计算两个密文C1C_1C2C_2
      • C1=gkmodpC_1 = g^k \mod p
      • C2=mykmodpC_2 = m \cdot y^k \mod p
    • 发送的密文为(C1,C2)(C_1, C_2)
  3. 解密过程

    • 收到密文(C1,C2)(C_1, C_2)后,用私钥xx解密:
    • 计算C1xmodpC_1^{-x} \mod p,然后用它乘以C2C_2得到明文mm
      • m=C2C1xmodpm = C_2 \cdot C_1^{-x} \mod p

这个方案的安全性主要基于离散对数问题的困难性,即在已知ggppgxmodpg^x \mod p的情况下,找出xx是非常困难的。然而,ElGamal加密方案的一个主要缺点是密文的长度是明文的两倍,这可能在需要传输大量数据的情况下成为问题。

解密的正确性证明

解密过程中的mm是通过以下步骤计算得到的:

m=C2C1xmodpm = C_2 \cdot C_1^{-x} \mod p

我们可以将C1C_1C2C_2的定义代入上式,得到:

m=(mykmodp)(gkmodp)xmodpm = (m \cdot y^k \mod p) \cdot (g^k \mod p)^{-x} \mod p

然后,我们可以将yy的定义(y=gxmodpy = g^x \mod p)代入上式,得到:

m=(m(gxmodp)kmodp)(gkmodp)xmodpm = (m \cdot (g^x \mod p)^k \mod p) \cdot (g^k \mod p)^{-x} \mod p

因为(amodn)bmodn=(abmodn)(a \mod n)^b \mod n = (a^b \mod n),我们可以简化上式为:

m=(mgxkmodp)(gkxmodp)1modpm = (m \cdot g^{xk} \mod p) \cdot (g^{kx} \mod p)^{-1} \mod p

此处的gkxg^{kx}gxkg^{xk}是相等的,所以我们可以进一步简化上式为:

m=m(gxkmodp)(gxkmodp)1modpm = m \cdot (g^{xk} \mod p) \cdot (g^{xk} \mod p)^{-1} \mod p

最后,根据模运算的性质,我们可以得到:

m=mmodpm = m \mod p

所以,解密过程是正确的,解密后的消息mm就是原始的明文消息。