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 相关文章推荐
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
python目录与文件名操作例子
Aug 28 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python 生成图形验证码的方法示例
Nov 11 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
对于Python深浅拷贝的理解
Jul 29 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 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
apache rewrite_module模块使用教程
2008/01/10 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
PHP代码加密的方法总结
2020/03/13 PHP
用JS实现的一个include函数
2007/07/21 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
vue中mint-ui的使用方法
2018/04/04 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
Python subprocess模块学习总结
2014/03/13 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
基于Python的接口测试框架实例
2016/11/04 Python
python getopt详解及简单实例
2016/12/30 Python
python八大排序算法速度实例对比
2017/12/06 Python
python3.4实现邮件发送功能
2018/05/28 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
使用Python函数进行模块化的实现
2019/11/15 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
python中wheel的用法整理
2020/06/15 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
通信工程专业毕业生推荐信
2013/12/25 职场文书
国窖1573广告词
2014/03/21 职场文书
慰问信格式
2015/02/14 职场文书
最感人的道歉情书
2015/05/12 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python