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之入门(四)运算
May 27 Python
python中assert用法实例分析
Apr 30 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
Python插件机制实现详解
May 04 Python
python 星号(*)的多种用途
Sep 21 Python
python 下划线的不同用法
Oct 24 Python
python利用appium实现手机APP自动化的示例
Jan 26 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 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自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
php实现简单四则运算器
2020/11/29 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
pycharm远程调试openstack的图文教程
2017/11/21 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
2014年驻村干部工作总结
2014/11/17 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
python实现局部图像放大
2021/11/17 Python
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android