Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例


Posted in Python onFebruary 11, 2020

关于非对称加密算法我就不过多介绍了,本文着重于python3对RSA算法的实现。

from Crypto.PublicKey import RSA
import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 #用于签名/验签
from Crypto.Cipher import PKCS1_v1_5 #用于加密
from Crypto import Random
from Crypto import Hash
 
 
x = RSA.generate(2048)
# y = RSA.generate(2048, Random.new().read)  #也可以使用伪随机数来辅助生成
s_key = x.export_key() #私钥
g_key = x.publickey().export_key() #公钥
# print(s_key,'\n111\n',g_key)
 
 
 
#写入文件--1
# with open("c.pem", "wb") as x:
#   x.write(s_key)
# with open("d.pem", "wb") as x:
#   x.write(g_key)
 
 
#从文件导入密钥 -- 通过私钥生成公钥 (公钥不会变 -- 用于只知道私钥的情况)--2
# with open('c.pem','rb')as x:
#   s_key = RSA.importKey(x.read())
# # new_g_key = s_key.publickey().export_key()
# # print(new_g_key)
#
# cert = s_key.export_key("DER") #生成证书 -- 它和私钥是唯一对应的
# print(cert)
 
 
#实现RSA 非对称加解密
my_private_key = s_key # 私钥
my_public_key = g_key # 公钥
 
 
############ 使用公钥 - 私钥对信息进行"加密" + "解密" ##############
'''
作用:对信息进行公钥加密,私钥解密。
应用场景:
  A想要加密传输一份数据给B,担心使用对称加密算法易被他人破解(密钥只有一份,一旦泄露,则数据泄露),故使用非对称加密。
  信息接收方可以生成自己的秘钥对,即公私钥各一个,然后将公钥发给他人,私钥自己保留。
  
  A使用公钥加密数据,然后将加密后的密文发送给B,B再使用自己的私钥进行解密,这样即使A的公钥和密文均被第三方得到,
  第三方也要知晓私钥和加密算法才能解密密文,大大降低数据泄露风险。
'''
 
def encrypt_with_rsa(plain_text):
 
  #先公钥加密
  cipher_pub_obj = PKCS1_v1_5.new(RSA.importKey(my_public_key))
  _secret_byte_obj = cipher_pub_obj.encrypt(plain_text.encode())
 
  return _secret_byte_obj
 
def decrypt_with_rsa(_secret_byte_obj):
 
  #后私钥解密
  cipher_pri_obj = PKCS1_v1_5.new(RSA.importKey(my_private_key))
  _byte_obj = cipher_pri_obj.decrypt(_secret_byte_obj, Random.new().read)
  plain_text = _byte_obj.decode()
 
  return plain_text
 
def executer_without_signature():
 
  #加解密验证
  text = "I love CA!"
  assert text == decrypt_with_rsa(encrypt_with_rsa(text))
  print("rsa test success!")
 
 
 
############ 使用私钥 - 公钥对信息进行"签名" + "验签" ##############
'''
作用:对解密后的文件的完整性、真实性进行验证(繁琐但更加保险的做法,很少用到)
应用场景:
  A有一私密文件欲加密后发送给B,又担心因各种原因导致B收到并解密后的文件并非完整、真实的原文件(可能被篡改或丢失一部分),
  所以A在发送前对原文件进行签名,将[签名和密文]一同发送给B让B收到后用做一下文件的[解密 + 验签],
  均通过后-方可证明收到的原文件的真实性、完整性。
  
'''
def to_sign_with_private_key(plain_text):
 
  #私钥签名
  signer_pri_obj = sign_PKCS1_v1_5.new(RSA.importKey(my_private_key))
  rand_hash = Hash.SHA256.new()
  rand_hash.update(plain_text.encode())
  signature = signer_pri_obj.sign(rand_hash)
 
  return signature
 
def to_verify_with_public_key(signature, plain_text):
 
  #公钥验签
  verifier = sign_PKCS1_v1_5.new(RSA.importKey(my_public_key))
  _rand_hash = Hash.SHA256.new()
  _rand_hash.update(plain_text.encode())
  verify = verifier.verify(_rand_hash, signature)
 
  return verify #true / false
 
def executer_with_signature():
 
  #签名/验签
  text = "I love CA!"
  assert to_verify_with_public_key(to_sign_with_private_key(text), text)
  print("rsa Signature verified!")
 
 
if __name__ == '__main__' :
 
  executer_without_signature() # 只加密不签名
 
  executer_with_signature() #只签名不加密
 
  #二者结合食用更佳
'''
如果是加密的同时又要签名,这个时候稍微有点复杂。
1、发送者和接收者需要各持有一对公私钥,也就是4个钥匙。
2、接收者的公私钥用于机密信息的加解密
3、发送者的公私钥用于机密信息的签名/验签
4、接收者和发送者都要提前将各自的[公钥]告知对方。
'''

更多关于Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例请查看下面的相关链接

Python 相关文章推荐
Python列表(list)常用操作方法小结
Feb 02 Python
Python进程间通信Queue实例解析
Jan 25 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
Pandas 同元素多列去重的实例
Jul 03 Python
Python实现随机漫步功能
Jul 09 Python
对python的输出和输出格式详解
Dec 08 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python常用运维脚本实例小结
Feb 14 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
python 遗传算法求函数极值的实现代码
Feb 11 #Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 #Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 #Python
Python中包的用法及安装
Feb 11 #Python
使用Python实现牛顿法求极值
Feb 10 #Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 #Python
TensorFlow 多元函数的极值实例
Feb 10 #Python
You might like
PHP EOT定界符的使用详解
2008/09/30 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
js实现图片局部放大效果详解
2019/03/18 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
深入理解python多进程编程
2016/06/12 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python使用代理ip访问网站的实例
2018/05/07 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
浅谈python常用程序算法
2019/03/22 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Python实现汇率转换操作
2020/05/03 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
工厂采购员岗位职责
2014/04/08 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
小学班级管理心得体会
2016/01/07 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
Win10 Anaconda安装python-pcl
2022/04/29 Servers