总的来说,需要用到的对象有三个:

Crypto.PublicKey.RSA:用来生成RSA算法的密钥对象

Crypto.Hash.SHA384:用来获取信息的摘要对象

Crypto.Signature.pkcs1_15:用来实现数字签名和检验对象

前提条件

创建RSA对象,生成密钥 key = RSA.generate(1024),参数表示RSA模块的长度,至少为1024,必须是1024的倍数,推荐是2048,一般可以用到3072。

一、数字签名的过程

1. 创建一个数字签名对象,signer = pkcs1_15.new(key),参数是之前生成的密钥对中的私钥。

2. 创建一个HASH对象,hasher = SHA384.new(message.encode()),参数是要发送和签名的文本信息的二进制形式。

3. 调用签名对象的方法完成签名,sign_obj = signer.sign(hasher),参数是哈希对象,返回的是签名内容(byte string)。

二、检验签名的过程

1. 创建一个数字签名(检验)对象,verifer = pkcs1_15.new(key.publickey()),其参数为之前的密钥对中的公钥。

2. 创建一个HASH对象,hasher = SHA384.new(message.encode()),与数字签名中的对象相同。

3. 调用签名对象的检验方法,verifer.verify(hasher, sign_new),参数1表示使用的信息摘要算法对象,参数2是收到的签名内容(byte string);如果校验失败,将抛出异常,否则,正常执行。

完整代码参考:

from Crypto.PublicKey import RSA
from Crypto.Hash import SHA384
from Crypto.Signature import pkcs1_15# 生成RSA密钥对
key = RSA.generate(1024)# 待签名内容(发送的文本内容)
message = 'I am MKing hello everyone'# 签名
signer = pkcs1_15.new(key)
hasher = SHA384.new(message.encode()) #Hash对象,取内容摘要
#hasher.update(message.encode()) # 换种方式使用也可以
sign_obj = signer.sign(hasher)     #用私钥对消息签名print('签名内容:', sign_obj)# 将签名写入文件,模拟发送(同时还发送了文本内容,为了方便,不写文件,后面直接引用)
with open('sign.bin', 'wb') as f:f.write(sign_obj)# 读取签名内容,模拟接收
with open('sign.bin', 'rb') as f:sign_new = bytearray(f.read())  # 签名内容(二进制),并转成bytearray,以便修改#sign_new.append(0x32)  # 模拟错误的签名
print('收到签名:', sign_obj)# 验证签名
verifer = pkcs1_15.new(key.publickey()) # 使用公钥创建校验对象
hasher = SHA384.new(message.encode()) # 对收到的消息文本提取摘要
#hasher.update(message.encode())try:verifer.verify(hasher, sign_new) # 校验摘要(本来的样子)和收到并解密的签名是否一致print("The signature is valid.")
except (ValueError, TypeError):print("The signature is not valid.")

参考资料:

[1] Crypto.Signature package.https://pycryptodome.readthedocs.io/en/latest/src/signature/signature.html

使用Crypto实现RSA算法的数字签名和检验相关推荐

  1. Windows自带的加密算法Crypto实现MD5, AES256以及RSA算法

    密码学我了解的很少,但是在逆向中这却是非常重要的基础.这个Crypto函数库是windows自带的,我实现了散列算法MD5[128位], 对称加密算法AES[256位]以及RSA算法.散列函数实现改几 ...

  2. Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto

    目录 简介 函数 1.pem公钥内容转xml 2.pem私钥内容转xml 3.使用公钥对数据进行加密 4.使用私匙对待签名内容进行签名 示例 简介 在调用Java后端接口,需要使用后端提供的pem私钥 ...

  3. C语言的EDS与RSA算法,数字签名原理eds算法是什么_生辰八字是什么算法

    数字签名算法sha-1的fpga高速实现 数字签名算法sha-1的fpga高速实现 数字签名技术原理介绍 数字签名算法sha 1的fpga高速实现 数字签名算法sha-1的fpga高速实现 数字签名算 ...

  4. 一个基于RSA算法的Java数字签名例子

    ====================================================== 注:本文源代码点此下载 ================================= ...

  5. RSA密码算法和数字签名技术

    目录 密钥生成过程 加密和解密 举例 数字签名技术 举例 中国剩余定理 密钥生成过程 1.选取两个不同的大素数p和q,为了安全程度最大,p和q长度一致,计算模n=pq: 2.计算模n的欧拉函数:φ(n ...

  6. 数字签名技术以及RSA算法的原理实现

    数字签名技术 1)对称加密与非对称加密 对称加密:对文件的加密和解密采用的都是同一个密钥,有IDEA和DES两种加密算法 非对称加密:有一对公钥和私钥 如果我们使用公钥加密,必须得用私钥解密:如果使用 ...

  7. 关于RSA算法的探究 -Crypto 0x01

    -亚里士多德 关于RSA算法 -数论 在上一篇的简单的ctf题目我们看到整个加解密过程都是围绕着一个公钥和一个私钥展开的,这里不想太多赘述那些看起来非常繁琐的加解密过程.有关RSA背后涉及的数学的详细 ...

  8. 加密算法之RSA算法

    加密算法之RSA算法 RSA是目前使用最广泛的公钥密码体制之一.它是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adle ...

  9. 散列算法和数字签名笔记

    散列算法与数字签名 在RSA加密中,如果A是发送方,B是接受方,则A用B的公钥加密信息,而B可以用自己的私钥解密信息,从而达到保密传输的作用. 但是在数字签名技术中,这个过程恰好是反过来的,即:A是发 ...

最新文章

  1. android HTTP发送及MD5加密收集
  2. XE5 Android 开发数据访问手机端 解决乱码的办法
  3. centos 显示50g硬盘但是 实际大小很小_天啦噜!知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍...
  4. 蒙特卡罗方法求一个三维积分(论坛帮顶)
  5. linux使用jinja2模板_linux下安装python组件之jinja2
  6. Python的模板:HTML代码 + 模板语法
  7. [转]2020年2月份Github上最热门的开源项目,速来围观
  8. python序列操作_序列操作
  9. (CVPR2019)图像语义分割(18) DANet-集成双路注意力机制的场景分割网络
  10. php类型cms,自定义存储类型
  11. gaot工具箱介绍及应用
  12. 不可不看:管理定理一网打尽
  13. 面向对象:继承(经典类新式类继承原理、属性查找)、派生
  14. MATLAB显示slic,quickshift超像素分割结果图
  15. 空间点到直线距离的一种解法
  16. 程序员的日常|秃头?不存在的,这辈子都不可能秃头!
  17. 金万维链接服务器网络不稳定,研究使用金万维宽带通动态域名访问管家婆服务器反复出问题的原因...
  18. 5个超棒的Java企业级项目推荐,练手/毕设/私活都一步到位
  19. 米家机扫拖机器人说明书_米家扫拖机器人G1体验:智能线路规划 清扫更彻底
  20. 怎样快速上手PPT制作?

热门文章

  1. 京东首席数据官刘晖:聚焦银发经济,中老年线上消费趋势!
  2. iOS单元测试与集成
  3. eclipse 基础快捷键。
  4. 音视频开发系列(48)浅聊WebRTC视频通话
  5. 同事给介绍了这款图文转换成word文档,超好用!
  6. 在PyQt5中使用多进程(multiprocessing)
  7. 计算机安全警告,电脑打开文件会出现安全警告要如何关闭
  8. 约瑟环问题JAVA(数组)
  9. mac os系统复制粘贴ctrl+c ctrl+v快捷键实现方式
  10. SpringBoot实现WebSocket