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 23 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
python2.7实现爬虫网页数据
May 25 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
python将秒数转化为时间格式的实例
Sep 16 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
Apr 30 Python
python pandas生成时间列表
Jun 29 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 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新手上路(十一)
2006/10/09 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
Python ljust rjust center输出
2008/09/06 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
Python爬取某平台短视频的方法
2021/02/08 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
新闻专业个人求职信
2013/12/19 职场文书
理想演讲稿范文
2014/05/21 职场文书
班级活动总结格式
2014/08/30 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
Python+Tkinter打造签名设计工具
2022/04/01 Python
分享python函数常见关键字
2022/04/26 Python