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基础教程之python消息摘要算法使用示例
Feb 10 Python
python遍历类中所有成员的方法
Mar 18 Python
python图像处理之镜像实现方法
May 30 Python
python:print格式化输出到文件的实例
May 14 Python
便捷提取python导入包的属性方法
Oct 15 Python
学习python分支结构
May 17 Python
python如何将多个PDF进行合并
Aug 13 Python
Python正则表达式急速入门(小结)
Dec 16 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
pandas中DataFrame检测重复值的实现
May 26 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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
使用无限生命期Session的方法
2006/10/09 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
载入进度条 效果
2006/07/08 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
深入理解Python中的内置常量
2017/05/20 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
在django模板中实现超链接配置
2019/08/21 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
python使用建议与技巧分享(二)
2020/08/17 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
工程地质勘察专业大学生求职信
2013/10/13 职场文书
住房公积金接收函
2014/01/09 职场文书
幼儿园小班评语
2014/04/18 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
php引用传递
2021/04/01 PHP
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
欧元符号 €
2022/02/17 杂记