4.6 EIGamal算法

ElGamal算法既可以用于加密,也可以用于签名,其安全性依赖于有限域上计算离散对数的难度。要产生一对密钥,首先选择一素数p,整数模p的一个原根g,随机选取xgx都小于p,然后计算:

y=gx mod p

公开密钥是ygp,其中gp可以为一组用户共享,私有密钥是x

将明文信息M表示成{0,1,…,p-1}范围内的数,加密时,秘密选择随机数k,计算:

a = gk mod p

b = ykM mod p

ab)作为密文。注意,密文长度是明文的两倍,信息有扩张。

解密时,计算:

M=b/ax mod p

axgkx mod pb/axykM/axgxkM/gxkM mod p

下面的例子说明ElGamal算法的加解密过程。

生成密钥:使用者Alice选取素数p =19及Z19*的生成元g =2,Alice选取私钥x =10并计算:

gx mod p=210mod19=17

A的公钥是p=19,g=2,gx=17

加密:为加密消息m = 16,Bob选取一个随机整数k = 9并计算:

a =29 mod 19 =18

b =16×179mod19=16

Bob发送ab给Alice

解密:Alice计算:

a-x≡18p-1-x≡188≡1(mod19)

Mb/axba-x≡16×1≡16(mod19)

攻击ElGamal加密算法等价于解离散对数问题,要使用不同的随机数k加密不同的信息。假设用同一个k加密两个消息m1m2,所得到的密文分别为(a1b1)(a2b2),则b1/b2=m1/m2,故当m1已知,m2可以很容易地计算出来。