Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
作者:岳古 发布时间:2023-05-20 01:36:21
标签:Python3,RSA,Crypto
关于非对称加密算法我就不过多介绍了,本文着重于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、接收者和发送者都要提前将各自的[公钥]告知对方。
'''
来源:https://blog.csdn.net/sc_lilei/article/details/83027970


猜你喜欢
- 一、准备工作开始之前,先参考上一篇: struts2.3.24 + spring4.1.6 + hibernate4.3.11 +
- 在深度学习或者其他类型的GPU运算过程中,对于GPU信息的监测也是一个非常常用的功能。如果仅仅是使用系统级的GPU监测工具,就没办法非常细致
- 简介想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了。这是一个能让你了解自己的
- 本文实例讲述了python自动化测试之setUp与tearDown的用法,分享给大家供大家参考。具体如下:实例代码如下:class Roma
- 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表
- Python小白一只,正在成长,程序自己设计,很多不足,算法很多地方能优化。欢迎大佬来指教。游戏效果创建设置类,储存游戏基础数据可以不使用这
- 1、选择排序选择排序是一种简单直观的排序算法。它的原理是这样:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余
- Python3中的map()、reduce()、filter() 这3个一般是用于对序列进行操作的内置函数,它们经常需要与 匿名函数 lam
- MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Win
- # -*- coding: utf-8 -*-import sysimport MySQLdbreload(sys)sys.setdefau
- 数据库访问是程序中应用最普遍的部分。随着C#和ADO.NET的引入,这种操作变得更简单。这篇文章将示范四种最基础的数据库操作。
- 1、生成器函数包含yield from表达式。2、在yield from表达式处暂停委派生成器,调用方可直接将数据发送给子生成器。3、子生成
- Keepalived由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+hap
- 与运算 &举例: 3&5 &n
- 因为公司需要在原有的web开发上,实现3d效果。根据需求正在学习webgl,主攻cesium这一块,采用的工具是webstorm.但是使用一
- python实现四舍五入""" 四舍五入 :param
- 用v-model绑定单选框能带来很多便捷的开发体验。基础用法<template> <div id="app&qu
- 一、单表查询—>更新UPDATE table_nameSET field1=new-value1, field2=new-value2
- Python两个内置函数——locals 和globals这两个函数主要提供,基于字典的访问局部和全局变量的方式。在理解这两个函数时,首先来
- 最近在学着用easyui,发现框架用起来果然是方便简洁,能弄出这框架的都是大神级别了吧,牛啊....今天碰到这个应用可以说是让我非常之无语,