一、实验目的
借助Python的标准库和扩展库,实现数字签名的产生和验证过程。
二、实验所用仪器(或实验环境)
Python3.6
三、实验基本原理及步骤(或方案设计及理论计算)
实验原理:
Python标准库hashlib实现了SHA1,SHA224以及MD5等多个安全哈希算法,Python扩展库pycryptodome和cryptography提供了SHA系列算法和其他哈希算法,以及DES,AES,RSA等多个加密算法和数字签名算法的实现。
实验步骤:
利用Python实现DSA或者RSA数字签名的产生和验证过程。
- 任务1:准备一个私钥文件,一个公钥文件,一个数据文件;
- 任务2:定义一个函数,能够使用指定的私钥对数据文件进行签名,并将签名结果输出到文件返回;
- 任务3:定义一个函数,能够使用指定的公钥对任务2中的签名文件进行验证,返回验证结果;
- 任务4:利用任务1中的文件对任务2和3中的函数进行测试。
四、实验数据记录(或仿真及软件设计)
- 任务一:
准备一个私钥文件,一个公钥文件,一个数据文件
代码:
# 加密解密:公钥加密,私钥解密
#
# 签名验签:私钥签名,公钥验签
#
# 生成 private key and pulic key
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)
# master的秘钥对的生成
private_pem = rsa.exportKey()
with open('master-private.pem', 'wb') as f:
f.write(private_pem)
public_pem = rsa.publickey().exportKey()
with open('master-public.pem', 'wb') as f:
f.write(public_pem)
# ghost的秘钥对的生成
private_pem = rsa.exportKey()
with open('ghost-private.pem', 'wb') as f:
f.write(private_pem)
public_pem = rsa.publickey().exportKey()
with open('ghost-public.pem', 'wb') as f:
f.write(public_pem)
print("公钥与私钥已产生完成")
- 任务二:
代码:
#使用指定的私钥对数据文件进行签名,并将签名结果输出到文件返回;
def qianming(message):
with open('master-private.pem') as f:
key = f.read()
rsakey = RSA.importKey(key)
signer = Signature_pkcs1_v1_5.new(rsakey)
#哈希加密
digest = SHA.new()
#此处进行数字签名
digest.update(message)
sign = signer.sign(digest)
signature = base64.b64encode(sign)
with open('signature.pem','wb') as fp1:
fp1.write(signature)
fp1.close()
print(signature)
print("signature已成功写入signature.pem文件")
return signature
- 任务三:
代码:
#验证签名过程
def qianzheng(message,signature):
with open('master-public.pem') as f:
key = f.read()
rsakey = RSA.importKey(key)
verifier = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
# Assumes the data is base64 encoded to begin with
digest.update(message)
is_verify = verifier.verify(digest, base64.b64decode(signature))
print(is_verify)
- 任务四:综合判断:
代码:
#...前面三步
with open("data.txt",'r') as f1:
message=f1.read()
message=message.encode()
signature=qianming(message)
qianzheng(message,signature)
运行截图:
五、实验结果分析及回答问题(或测试环境及测试结果)
这个实验有点难顶,主要还是对这个Crypto密码库比较陌生,查阅资料用了好久…
然后找函数调用,(此处这个pem文件,我看别人都是这么写,那我也这么写…虽然我也不知道跟txt区别在哪里)经常出现的错误就是字节流跟字符串的转化,这个调试也花了不少时间,在这里要感谢Crypto这个库的作者,让我们只要调用函数就行了,倒也不用太复杂,要不然光一个公钥私钥的生成就够忙活的…真挚的谢谢他.