注意:只是个人理解,可能有不正确的地方
ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出。
ElGamal加密算法可以应用在任意一个循环群(cyclic group)上。在群中有的运算求解很困难,这些运算通常与求解离散对数(Discrete logarithm)相关,求解的困难程度决定了算法的安全性。
群(Group)的定义:
群是数学中的概念。
一些元素组成的集合,如果元素满足以下条件,则把这些元素组成的集合叫做群:
在元素上可以定义一个2元运算,运算满足封闭性、结合律、单位元和逆元。
群的例子:
所有整数构成一个群,如果定义的2元运算为整数加法的话。加法可以满足上述条件:
封闭性:a+b之后仍然是整数
结合率:(a + b) + c = a +(b + c)
单位元:0 + a = a + 0 = a,则整数0为加法的单位元
逆元:a + b = b + a = 0,则整数b叫做整数a的逆元
所以可以简单的将群理解为一些元素的集合加上一个选定的运算方式。
循环群的定义:
循环群中的所有其它元素都是由某个元素g运用不同次数的选定运算方式计算出来的。
公钥生成:
1、选取一个循环群G,且循环群G的阶数为q
2、选择一个随机数x,1<x<q-1
3、计算h=g^x
h和g,G,q就构成公钥
x是保密的,x与h,g,G,q一起构成密钥
公钥加密:
1、选取一个随机数y,1<y<q-1
2、计算c1=g^y
3、计算s=h^y=(g^x)^y=g^(x*y)
4、加密数m得c2=m*s
c1、c2构成加密结果,交给私钥解密
私钥解密:
1、通过c1计算得到s=c1^x=(g^y)^x=g^(x*y)
2、计算c2*(s^-1)=(m*s)*(s^-1),得到原来数m
注意以上的运算不再是普通的乘(*)和乘方(^)运算,而且有循环群G对应的运算衍生出来的运算。但这些运算的意义和规律还是和普通数字运算的规律一样的,所以上面的等式仍然成立。
由上面看出s的计算过程和Diffie-Hellman密钥交换算法类似。
在应用中通常使用的循环群G为整数模n乘法群(Multiplicative group of integers modulo n)。
同余:
如果整数a、b的对于整数n的模相等即a%n=b%n,则称a和关于模n同余。可以记做:
a≡b (mod n)
互质(Coprime integers):
如果整数a、b的最大公因数为1,则a、b互质。
整数模n乘法群:由模n的互质同余类组成一个乘法群。
签名和验证算法,基于整数模n乘法群:
私钥,公钥生成:
1、选取一个随机数k,1<x<p-1
2、计算y=g^x%p
(g, p, y)为公钥,x为私钥。
用私钥签名:
1、选取一个随机数k,1<k<p-1,且k和p-1互质
2、计算r,r满足:r≡g^k (mod p)
3、计算s,s满足:s≡(H(m)-xr)*(k^(-1)) (mod p-1)
m为待签名信息,H(m)为m的哈希(比如sha1)结果。
(r,s)构成对m的签名
用公钥验证签名:
1、验证:0<r<p,0<s<p-1
2、验证:g^(H(m))≡(y^r)*(r^s) (mod p)
签名算法正确性证明:
由签名过程得:H(m) ≡s*k+x*r (mod p-1)
根据费马小定理:
g^(H(m))≡g^(x*r)*g^(k*s) (mod p)≡((g^x)^r)*(g^k)^s (mod p) ≡ (y^r)*(r^s) (mod p)
费马小定理:
如果p为质数,则任意整数a:
a^(p-1) ≡1 (mod p)
即存在整数k使 a^(p-1) = k*p +1
再广义化一些:
如果p为质数,且整数m、n满足:m ≡n (mod p-1),那么对任意整数a:
a^m ≡ a^n (mod p)
如果m=p-1,n=0,那么上市转换为一般形式:a^(p-1) ≡1 (mod p)
参考:
ElGamal加密算法: http://en.wikipedia.org/wiki/ElGamal_encryption
群: http://zh.wikipedia.org/wiki/%E7%BE%A4
循环群: http://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%BE%A4
同余运算: http://zh.wikipedia.org/wiki/%E5%90%8C%E9%A4%98
互质: http://zh.wikipedia.org/wiki/%E4%BA%92%E8%B3%AA
整数模n乘法群: http://zh.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E6%A8%A1n%E4%B9%98%E6%B3%95%E7%BE%A4
离散对数: http://en.wikipedia.org/wiki/Discrete_logarithm
Diffie-Hellman密钥交换算法: http://my.oschina.net/u/1382972/blog/330456
费马小定理: http://zh.wikipedia.org/wiki/%E8%B4%B9%E9%A9%AC%E5%B0%8F%E5%AE%9A%E7%90%86