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自动生成文章
Dec 25 Python
python实现提取百度搜索结果的方法
May 19 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
python实现简单银行管理系统
Oct 25 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python requests接口测试实现代码
Sep 08 Python
python向企业微信发送文字和图片消息的示例
Sep 28 Python
pandas DataFrame.shift()函数的具体使用
May 24 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
德生PL330测评
2021/03/02 无线电
php网站地图生成类示例
2014/01/13 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
基于jquery的表格排序
2010/09/11 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
js+html制作简单验证码
2017/02/16 Javascript
JS实现页面打印功能
2017/03/16 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
简述JS控制台的使用
2018/07/15 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
自我推荐书
2013/12/04 职场文书
2014年班干部工作总结
2014/11/25 职场文书
董事长秘书工作总结
2015/08/14 职场文书