1、用Python或Sage实现RSA算法的加密、解密、签名/验证签名
2、用Python或Sage实现DH秘钥交换协议的。
请提交代码的网页链接,不要提交代码压缩包。
代码如下:
1.
import rsa
(pubkey, privkey) = rsa.newkeys(1024)
# 生成密钥
with open('public.pem','w+') as f:
f.write(pubkey.save_pkcs1().decode())
with open('private.pem','w+') as f:
f.write(privkey.save_pkcs1().decode())
# 保存密钥
with open('public.pem','r') as f:
pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
with open('private.pem','r') as f:
privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
# 导入密钥
message = 'secret'
crypto = rsa.encrypt(message.encode(), pubkey)
# 公钥加密
message = rsa.decrypt(crypto, privkey).decode()print(message)
# 私钥解密
signature = rsa.sign(message.encode(), privkey, 'SHA-1')
# 私钥签名
rsa.verify(message.encode(), signature, pubkey)
# 公钥验证
2.
import random
import math
def isprime() :
#素数判断
count = 1
while count:
n = int(input("请输入一个素数p:"))
for i in range(2, n):
if n % i == 0:
print("%d不是素数!" % n)
break
else:
return n
def get_generator( p):
#获取一个原根
#素数必存在至少一个原根
#g^(p-1) = 1 (mod p)当且仅当指数为p-1的时候成立
a=2
while 1:
if a**(p-1) % p == 1:
num = 2
mark = 0
while num < p-1:
if a**num % p == 1:
mark = 1
num += 1
if mark == 0:
return a
a += 1
def get_cal(a, p, rand):
#获得计算数
cal = (a**rand) % p
return cal
def get_key(cal_A,cal_B,p):
#获得密钥
key = (cal_B ** cal_A ) % p
return key
def Is_sameKey(S_a, S_b):
#判断密钥是否相同
if S_a == S_b:
print("A所得的密钥与B相同")
else:
print("A所得的密钥与B不相同")
if __name__ == "__main__":
p = isprime()
a = get_generator(p)
print("p的一个原根为%d"%a)
rand_A = random.randint(0, p-1)
cal_A = get_cal(a, p, rand_A)
print("A随机数%d得到的计算数为%d" % (rand_A, cal_A))
rand_B = random.randint(0, p-1)
cal_B = get_cal(a, p, rand_B)
print("B随机数%d得到的计算数为%d" % (rand_B, cal_B))
S_a = get_key(rand_A, cal_B, p)
print("A的密钥为%d" % S_a)
S_b = get_key(rand_B, cal_A, p)
print("B的密钥为%d" % S_b)
Is_sameKey(S_a, S_b)