ElGamal
ElGamal
ElGamal算法
此时有一个需被加密的消息x。
密钥生成:
随机取一个大素数p,并取Zp*的一个本原元作为α,再从{2,…,p-2}中随机取一个数作为d,计算β ≡ αd mod p 。({d}为私钥,{p,α,β}为公钥。)
加密:
再次从{2,…p-2}中随机取一个数作为r,计算kr≡αr mod p。计算km≡βr mod p。
计算y≡km*x mod p,y就是加密出的密文。
解密:
计算x≡(krd )-1*y mod p 得出x。
ElGamal协议
ElGamal协议是对ElGamal方案的正式定义。
为了方便描述,我们先假设有Alice和Bob这两个人。
为了保证消息的私密性,二人决定对传递的消息加密。
首先,Bob随机取一个大素数p,并取Zp*的一个本原元作为α,在从{2,…,p-2}中随机取一个数字作为d,并计算β≡αd mod p。
Bob将p和α对外公开,并将(p,α,β)作为公钥kpub发送给Alice。
Alice从{2,…,p-2}中选择一个数作为r,计算kr ≡ αr mod p。计算km ≡ βr mod p。
并将消息x(x的长度必须小于p)通过y≡x*km mod p加密成y。最后,Alice将(kr,y)发送给Bob。
Bob通过km ≡ krd mod p 计算出掩码密钥km,而后再通过计算x ≡ y*k-1 mod p得到x。
ElGamal协议的验证
Alice需加密的消息为x=11。
Bob生成一个素数P=13,取α=2。选择d=8,则可以计算出β=9。而后Bob将(p,α,β)作为kpub发送给Alice。
Alice选择r=5,计算出kr=αr ≡ 6 mod 13,再计算出km=βr ≡ 3 mod 13,再对消息x进行加密,计算y=x*km ≡ 7 mod 13。而后再将(kr , y)发送给Bob。
Bob通过km=krd ≡ 3 mod 13,得到了km,最后只要计算x=y*km-1 ≡ 11 mod 13,便成功还原出了消息x。
ElGamal加密和解密的代码的简单实现
这里我直接将加密和解密的代码写在一起,方便验证其正确性。代码中的P是提前生成的大素数,af是Zp*的一个本原元。(代码是用Python写的。)
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!