基于Python实现数字签名的产生和验证

一、实验目的

借助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中的函数进行测试。

四、实验数据记录(或仿真及软件设计)

  1. 任务一:

准备一个私钥文件,一个公钥文件,一个数据文件

代码:

# 加密解密:公钥加密,私钥解密
#
# 签名验签:私钥签名,公钥验签
#
# 生成 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("公钥与私钥已产生完成")
  1. 任务二:
    代码:
#使用指定的私钥对数据文件进行签名,并将签名结果输出到文件返回;
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
  1. 任务三:
    代码:
#验证签名过程
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)

  1. 任务四:综合判断:

代码:

#...前面三步
with open("data.txt",'r') as f1:
       message=f1.read()

message=message.encode()
signature=qianming(message)
qianzheng(message,signature)

运行截图:
这里是运行成功截图
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


五、实验结果分析及回答问题(或测试环境及测试结果)

这个实验有点难顶,主要还是对这个Crypto密码库比较陌生,查阅资料用了好久…
然后找函数调用,(此处这个pem文件,我看别人都是这么写,那我也这么写…虽然我也不知道跟txt区别在哪里)经常出现的错误就是字节流跟字符串的转化,这个调试也花了不少时间,在这里要感谢Crypto这个库的作者,让我们只要调用函数就行了,倒也不用太复杂,要不然光一个公钥私钥的生成就够忙活的…真挚的谢谢他.

发布了29 篇原创文章 · 获赞 1 · 访问量 942

猜你喜欢

转载自blog.csdn.net/qq_40505187/article/details/104567241