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用ConfigObj读写配置文件的实现代码
Mar 04 Python
Python datetime时间格式化去掉前导0
Jul 31 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
定制FileField中的上传文件名称实例
Aug 23 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
python对象与json相互转换的方法
May 07 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
python异常处理之try finally不报错的原因
May 18 Python
python 绘制国旗的示例
Sep 27 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编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
php判断表是否存在的方法
2015/06/18 PHP
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
JS伪继承prototype实现方法示例
2018/06/20 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
使用Python写一个小游戏
2018/04/02 Python
pytorch实现查看当前学习率
2020/06/24 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
linux面试题参考答案(7)
2014/07/24 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
暑期实践思想汇报
2014/01/06 职场文书
教师辞职报告范文
2014/01/20 职场文书
酒店个人求职信范文
2014/01/25 职场文书
宣传标语大全
2014/07/01 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
Python基础之Socket通信原理
2021/04/22 Python
vue实力踩坑之push当前页无效
2022/04/10 Vue.js
MySQL三种方式实现递归查询
2022/04/18 MySQL
Hive日期格式转换方法总结
2022/06/25 数据库