密钥对产生算法
系统提供一个大素数p和GF(p)上的本原元素a,将p与a公开。对每一个用户A可选择
随机选择一个整数d作为私钥 2≤d≤p
公钥y=a^dmod p
加密算法
A与B保密通信,设明文为m
随机选择一个整数k 2≤k≤p
计算
c1=a^k (mod p)
c2=(y^k)*m(mod p)
(c1,c2)为密文,是明文的2倍长
解密算法
B收到密文以后解密方法如下:
m=c2*invert(c1^d,p) (mod p)
例子
设p = 11,g = 7,在GF(11)上有7^0=1,7^1=7,7^2=5,7^3=2,7^4=3,7^5=10,7^6=4,7^7=6,7^8=9,7^9=8,7^10=1,因此7是GF(11)上的本原元素。
计算GF(a)本原元
某个素数p,求得ξ(p)
如果某个数字a(一定小于p)满足a^(ξ(p))=1 (mod p)
a即为本原元
设P=97,a=5,d=58
y=5**58(mod 97)=44
公钥y=44
私钥d=58
设明文为m
k=36
c1=5**36 mod 97 =50
c2=(44**36)*3 mod 97=31
所以密文为(50,31)
m=31*invert(50**58,97) mod 97=31*22 mod 97=3
ELGamal数字签名
密钥产生对方法不变
随机选取一个数字k,1<k<p-1,且k和p-1互质
计算r,r满足r≡a^k (mod p)
设待签名信息为m,
计算s≡(m-dr)*invert(k,p-1) (mod p)
(r,s)构成对m的签名
签名验证有效性
验证1:0<r<p,0<s<p-1
验证2:a^m (mod p)≡(y^r)*(r^s)(mod p)
局限性
会话密钥k不能暴露给任何人,其值必须随机选取,而且必须确保在签不同的信息时会话密钥没有重复使用
必须避免选择到弱随机数“k为2或者3”
避免产生"弱签名",防止攻击者通过签名即可计算出签名者的私钥
为了避免替代攻击,必须使用单向Hash函数等
在使用ElGamal时密文会成倍增长