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实现爬取逐浪小说的方法
Jul 07 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
pandas重新生成索引的方法
Nov 06 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
Python如何调用外部系统命令
Aug 07 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
python实现飞船大战
Apr 24 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 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
Terran兵种对照表
2020/03/14 星际争霸
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
python zip文件 压缩
2008/12/24 Python
python3.x实现发送邮件功能
2018/05/22 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
西安众合通用.net笔试题
2013/03/18 面试题
超市创业计划书
2014/04/24 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
MySQL创建管理RANGE分区
2022/04/13 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS