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破解斗地主残局详解
Jun 30 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
Python中的heapq模块源码详析
Jan 08 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
详解python-图像处理(映射变换)
Mar 22 Python
Django 过滤器汇总及自定义过滤器使用详解
Jul 19 Python
Python中拆分字符串的操作方法
Jul 23 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python带参数打包exe及调用方式
Dec 21 Python
python实现简单飞行棋
Feb 06 Python
Pycharm安装python库的方法
Nov 24 Python
详解pycharm自动import所需的库的操作方法
Nov 30 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
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
vue中是怎样监听数组变化的
2020/10/24 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
python集合是否可变总结
2019/06/20 Python
python实现XML解析的方法解析
2019/11/16 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
毕业生求职的求职信
2013/12/05 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
青年文明号事迹材料
2014/01/18 职场文书
军训自我鉴定范文
2014/02/13 职场文书
体操比赛口号
2014/06/10 职场文书
环保标语大全
2014/06/12 职场文书
员工团队活动方案
2014/08/28 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
高中学生自我评价范文
2014/09/23 职场文书
辩论会主持词
2015/07/03 职场文书
导游词幽默开场白
2019/06/26 职场文书
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang