注意:只是我的理解,可能有不正确的地方算法
ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出。安全
ElGamal加密算法能够应用在任意一个循环群(cyclic group)上。在群中有的运算求解很困难,这些运算一般与求解离散对数(Discrete logarithm)相关,求解的困难程度决定了算法的安全性。加密
群(Group)的定义:spa
群是数学中的概念。.net
一些元素组成的集合,若是元素知足如下条件,则把这些元素组成的集合叫作群:blog
在元素上能够定义一个2元运算,运算知足封闭性、结合律、单位元和逆元。ip
群的例子:get
全部整数构成一个群,若是定义的2元运算为整数加法的话。加法能够知足上述条件:数学
封闭性:a+b以后仍然是整数it
结合率:(a + b) + c = a +(b + c)
单位元:0 + a = a + 0 = a,则整数0为加法的单位元
逆元:a + b = b + a = 0,则整数b叫作整数a的逆元
因此能够简单的将群理解为一些元素的集合加上一个选定的运算方式。
循环群的定义:
循环群中的全部其它元素都是由某个元素g运用不一样次数的选定运算方式计算出来的。
公钥生成:
一、选取一个循环群G,且循环群G的阶数为q
二、选择一个随机数x,1
三、计算h=g^x
h和g,G,q就构成公钥
x是保密的,x与h,g,G,q一块儿构成密钥
公钥加密:
一、选取一个随机数y,1
二、计算c1=g^y
三、计算s=h^y=(g^x)^y=g^(x*y)
四、加密数m得c2=m*s
c一、c2构成加密结果,交给私钥解密
私钥解密:
一、经过c1计算获得s=c1^x=(g^y)^x=g^(x*y)
二、计算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乘法群:
私钥,公钥生成:
一、选取一个随机数k,1
二、计算y=g^x%p
(g, p, y)为公钥,x为私钥。
用私钥签名:
一、选取一个随机数k,1
二、计算r,r知足:r≡g^k (mod p)
三、计算s,s知足:s≡(H(m)-xr)*(k^(-1)) (mod p-1)
m为待签名信息,H(m)为m的哈希(好比sha1)结果。
(r,s)构成对m的签名
用公钥验证签名:
一、验证:0
二、验证: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)
参考: