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中几个常用的类方法
Apr 08 Python
Python中正则表达式的用法总结
Feb 22 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
python爬虫基础知识点整理
Jun 02 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
Python pip 常用命令汇总
Oct 19 Python
python实现层次聚类的方法
Nov 01 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
用python做游戏的细节详解
2019/06/25 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python中six模块基础用法
2019/12/08 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
直接有效的自我评价
2014/01/11 职场文书
四年级数学教学反思
2014/02/02 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
党章学习心得体会2016
2016/01/14 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫