加密过程

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

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

  1. 密钥生成:

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

    • 对于要加密的明文mm,选择一个随机整数kk,满足1<k<p−11<k<p-1。
    • 计算两个密文C1C_1和C2C_2:
      • C1=gkmod  pC_1 = g^k \mod p
      • C2=m⋅ykmod  pC_2 = m \cdot y^k \mod p
    • 发送的密文为(C1,C2)(C_1, C_2)。
  3. 解密过程:

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

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

解密的正确性证明

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

m=C2⋅C1−xmod  pm = C_2 \cdot C_1^{-x} \mod p

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

m=(m⋅ykmod  p)⋅(gkmod  p)−xmod  pm = (m \cdot y^k \mod p) \cdot (g^k \mod p)^{-x} \mod p

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

m=(m⋅(gxmod  p)kmod  p)⋅(gkmod  p)−xmod  pm = (m \cdot (g^x \mod p)^k \mod p) \cdot (g^k \mod p)^{-x} \mod p

因为(amod  n)bmod  n=(abmod  n)(a \mod n)^b \mod n = (a^b \mod n),我们可以简化上式为:

m=(m⋅gxkmod  p)⋅(gkxmod  p)−1mod  pm = (m \cdot g^{xk} \mod p) \cdot (g^{kx} \mod p)^{-1} \mod p

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

m=m⋅(gxkmod  p)⋅(gxkmod  p)−1mod  pm = m \cdot (g^{xk} \mod p) \cdot (g^{xk} \mod p)^{-1} \mod p

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

m=mmod  pm = m \mod p

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