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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
详解Python3中yield生成器的用法
Aug 20 Python
Python制作简单的网页爬虫
Nov 22 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
python看某个模块的版本方法
Oct 16 Python
在python里从协程返回一个值的示例
Feb 19 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python文件处理fileinput使用方法详解
Jan 02 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
django实现模板中的字符串文字和自动转义
Mar 31 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后门URL的防范
2013/11/12 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
Node.js模块加载详解
2014/08/16 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python生成带有表格的图片实例
2019/02/03 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
大学生自荐书范文
2013/12/10 职场文书
大学生自我鉴定书
2014/03/24 职场文书
八项规定对照检查材料
2014/08/31 职场文书
历史博物馆观后感
2015/06/05 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
app场景下uniapp的扫码记录
2022/07/23 Java/Android