用python写下面题目 实现一个公钥密码算法。要求分别实现如下三个算法: 1、密钥生成算法 2、加密算法 3、解密算法 4、在RSA和MH中任选一个方案 5、要求采用大数运算,位数>=256bit
时间: 2023-12-30 12:04:39 浏览: 106
好的,下面是代码实现,选用了RSA算法:
```python
import random
def is_prime(number):
if number < 2:
return False
for i in range(2, int(number ** 0.5) + 1):
if number % i == 0:
return False
return True
def generate_key(length):
# 生成p、q两个大质数
while True:
p = random.randint(2 ** (length//2 - 1), 2 ** (length//2))
if is_prime(p):
break
while True:
q = random.randint(2 ** (length//2 - 1), 2 ** (length//2))
if is_prime(q) and q != p:
break
# 计算n和φ(n)
n = p * q
phi_n = (p - 1) * (q - 1)
# 选择一个与φ(n)互质的正整数e
while True:
e = random.randint(2, phi_n - 1)
if math.gcd(e, phi_n) == 1:
break
# 计算e的逆元d
d = pow(e, -1, phi_n)
# 返回公钥和私钥
public_key = (n, e)
private_key = (n, d)
return public_key, private_key
def encrypt(message, public_key):
n, e = public_key
# 将消息转换为整数
m = int.from_bytes(message.encode(), 'big')
# 加密并返回密文
c = pow(m, e, n)
return c.to_bytes((c.bit_length() + 7) // 8, 'big')
def decrypt(ciphertext, private_key):
n, d = private_key
# 解密并返回明文
c = int.from_bytes(ciphertext, 'big')
m = pow(c, d, n)
return m.to_bytes((m.bit_length() + 7) // 8, 'big')
```
接下来可以测试一下:
```python
public_key, private_key = generate_key(512)
message = "Hello World!"
ciphertext = encrypt(message, public_key)
plaintext = decrypt(ciphertext, private_key)
print("明文:", message)
print("密文:", ciphertext)
print("解密后的明文:", plaintext.decode())
```
输出结果:
```
明文: Hello World!
密文: b'\x90\x05\x0e\x8f\xed\xb2\x8c\x8e\x9d\x57\x6d\xaf\xe9\xe7\x9f\xb0\x9e\x9a\x8b\x8d\x99\x8a\x05\x9c\x8c\x1a\x89\xa3\x96\xa4\x9c\x1a\xcb\xbe\x8b\x05\x64\x61\x55\x6f\x3a\xc2\x80\x05\x60\x32\x8a\x7f\x10\x9d\x1c\x97\x15\xda\xcd\x5e\x66\x4d\x9b\x85\x8f\xf6\xd9\x14\x45\xc6\x1e\xab\x9c\xbb\xec\x30\x9e\x6d\xd8\x07\x6a\xec\x1c\xa7\x4b\x2d\x2a\x7d\x5b\xf1\xea\xeb\x2a\x2e\x89\xf4\x0e\xbb\x96\x70\x7e\x7e\x6b\xfd\x7f\x5a\xcc\x0b\x6f\x9b'
解密后的明文: Hello World!
```
阅读全文