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 40行代码实现人脸识别功能
Apr 02 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
Python MNIST手写体识别详解与试练
Nov 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加MYSQL服务器
2006/10/09 PHP
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
PHPCMS的使用小结
2010/09/20 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python 重命名轴索引的方法
2018/11/10 Python
举例讲解Python常用模块
2019/03/08 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
C# .NET面试题
2015/11/28 面试题
网管求职信
2014/03/03 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
看上去很美观后感
2015/06/10 职场文书
公司财务管理制度
2015/08/04 职场文书
严以律己学习心得体会
2016/01/13 职场文书
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js