ElGamal初学

密钥对产生算法

系统提供一个大素数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时密文会成倍增长
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值