加密过程:选取小于p的随机非负整数k, 对于明文M, 产生密文对{C1 = g ^ x mod p, C2 = M * y ^ k mod p}
解密过程:M = C2 / C1 ^ x mod p
注意:k需要永久保存,且不能重复使用
代码实现
# -*-coding:utf-8-*-"""
File Name: ElGamal算法加解密.py
Program IDE: PyCharm
Create Time: 2021-09-16 16:11
Create By Author: 陆依依
"""# 密钥产生:素数p,生成元g,小于p的随机非负整数x, 产生公钥: y = g ^ x mod p, 私钥: x## 加密过程:小于p的随机非负整数k, 明文M, 密文对{C1 = g ^ x mod p, C2 = M * y ^ k mod p}## 解密过程:M = C2 / C1 ^ x mod p## 注意:k需要永久保存,且不能重复使用defInit():print("ElGamal加密算法:")print("输入:素数p,生成元g,小于p的随机数x, 私钥:x,小于p的随机非负整数k, 明文M")print("请输入初始参数:")
p =int(input("大素数p="))
g =int(input("生成元g="))
x =int(input("随机数x="))
k =int(input("随机数k="))
M =int(input("明文M="))return p, g, x, k, M
defBuildKey(g, x, p):return g**x % p, x
defEncrypt(p, g, k, y, M):return g**k % p,(M * y**k)% p
# 求分数的模p同余 a/x mod pdefModP(a, x, p):# 统一x为正数if x <0:
x =-x
a =-a
# 统一a为非负数while a <0:
a += p
a = a % p
i =0whileTrue:if(i*x)% p == a:return i*x
i = i +1# 解密defDecrypt(C1, C2, x, p):return ModP(C2, C1**x, p)/abs(C1**x)# demoif __name__ =="__main__":# 初始化参数
p, g, x, k, M = Init()# 产生公私钥对(y, x)
y, x = BuildKey(g, x, p)# 加密,产生密钥对(C1, C2)
C1, C2 = Encrypt(p, g, k, y, M)print("密文对为{"+str(C1)+", "+str(C2)+"}")# 解密
M1 =int(Decrypt(C1, C2, x, p))print("解密后的明文:"+str(M1))