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的Django框架中的项目进行单元测试的方法
Apr 11 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 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的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
yii操作cookie实例简介
2014/07/09 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
python将图片文件转换成base64编码的方法
2015/03/14 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
教师民族团结演讲稿
2014/08/27 职场文书
法人授权委托书范本
2014/09/17 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS