import random def fastExpMod(a, e, m): a = a % m res = 1 while e != 0: if e&1: res = (res * a) % m e >>= 1 #右移一位 a = (a * a) % m return res # 求最大公约数 def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) # 扩展欧几里德算法求逆元 def extend_gcd(a, b): if b == 0: return 1, 0 else: x, y = extend_gcd(b, a % b) x, y = y, x - (a // b) * y return x, y # ElGamal密钥生成 def generate_key(p, g, x): y = pow(g, x, p) return (p, g, y, x), (p, g, y) # ElGamal加密 def encrypt(p, g, y, m): #Bob -- 加密 r = fastExpMod(g, k, p) c = (m * fastExpMod(y, k, p)) % p return r, c # ElGamal解密 def decrypt(ciphertext, private_key): r, c = ciphertext _, _, y = private_key k_inverse = extend_gcd(pow(r, p - 1 - y, p), p)[0] msg = chr((k_inverse * c) % p) return msg # 用户输入素数p和生成元g p = int(input("请输入一个大素数p:")) g = int(input("请输入一个在模p下的生成元g:")) # 用户输入私钥x和明文m x = int(input("请输入一个小于p-1的私钥x:")) m = input("请输入需要加密的明文m:") k= int(input('请输入一个随机数k:')) y = fastExpMod(g, k, p) # 生成ElGamal公钥和私钥 public_key, private_key = generate_key(p, g, x) # 对消息进行加密 ciphertext = encrypt(p, g, y, m) # 对密文进行解密 decrypted_msg = decrypt(ciphertext, private_key) # 输出结果 print(f"原始消息: {m}") print(f"加密后的消息: {ciphertext}") print(f"解密后的消息: {decrypted_msg}",改代码有误问题
时间: 2023-12-16 21:03:13 浏览: 30
在代码中,最后一行的 `print` 语句中存在中文逗号,应该改为英文逗号。此外,`decrypt` 函数中的 `chr` 函数只能用于将整数转换为 ASCII 码对应的字符,如果明文不是单个字符,则需要使用其他方法将其转换为字符串。
以下是修改后的代码:
```python
import random
def fastExpMod(a, e, m):
a = a % m
res = 1
while e != 0:
if e&1:
res = (res * a) % m
e >>= 1 #右移一位
a = (a * a) % m
return res
# 求最大公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 扩展欧几里德算法求逆元
def extend_gcd(a, b):
if b == 0:
return 1, 0
else:
x, y = extend_gcd(b, a % b)
x, y = y, x - (a // b) * y
return x, y
# ElGamal密钥生成
def generate_key(p, g, x):
y = pow(g, x, p)
return (p, g, y, x), (p, g, y)
# ElGamal加密
def encrypt(p, g, y, m, k): #Bob -- 加密
r = fastExpMod(g, k, p)
c = (m * fastExpMod(y, k, p)) % p
return r, c
# ElGamal解密
def decrypt(ciphertext, private_key):
r, c = ciphertext
_, _, y = private_key
k_inverse = extend_gcd(pow(r, p - 1 - y, p), p)[0]
msg = chr((k_inverse * c) % p)
return msg
# 用户输入素数p和生成元g
p = int(input("请输入一个大素数p:"))
g = int(input("请输入一个在模p下的生成元g:"))
# 用户输入私钥x和明文m
x = int(input("请输入一个小于p-1的私钥x:"))
m = int(input("请输入需要加密的明文m:"))
k = int(input('请输入一个随机数k:'))
y = fastExpMod(g, k, p)
# 生成ElGamal公钥和私钥
public_key, private_key = generate_key(p, g, x)
# 对消息进行加密
ciphertext = encrypt(p, g, y, m, k)
# 对密文进行解密
decrypted_msg = decrypt(ciphertext, private_key)
# 输出结果
print(f"原始消息: {m}")
print(f"加密后的消息: {ciphertext}")
print(f"解密后的消息: {decrypted_msg}")
```
请注意,此代码仅适用于加密单个字符的情况。如果要加密多个字符,需要使用其他方法将其转换为整数或二进制格式,并对加密、解密函数进行修改。