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
0
投稿
猜你喜欢
- 做程序开发的人都知道版本控制的重要性, 代码的管理好说,TFS/SVN/VSS/CVS,哪个都能用。但涉及到数据库的版本控制,就不是太好做的
- 原因我们在安装第三方库时,通常使用pip或pycharm的图形界面(右下角Python版本 -> 解释器设置 -> 加号)安装在
- 1、简单的按钮js事件 用于判断和显示提示 <script type="text/javascript&
- 本文实例讲述了PHP截取指定图片大小的方法。分享给大家供大家参考。具体分析如下:imagecopyresampled($newim, $im
- 持续集成(CI)作业可以产生大量的数据。当作业失败时,找出了什么问题可能是一个繁琐的过程,需要对日志进行调查以发现根本原因-这通常是在作业总
- 用IIS调试ASP程序时,有的页面可以显示出错行及出错原因,虽然原因不是很具体但足以引导调试程序,但有些时候就直接出现:HTTP 500 -
- 代码如下: <!--[if IE 6]><script type="text/javascript"&
- 大家是否还记得1983年任天堂的著名游戏《超级玛丽》里那个留着胡子的意大利水管工人,还有日本konami公司1987年发行的射击游戏《魂斗罗
- “模板化”——这也许是视觉设计师通常最不愿意听到的概念,先入为主的会产生“批量生产”、“体力活儿”、“限制思维”等概念,总之都比较负面。但为
- PHP count() 函数实例计算 car 节点的子节点个数:<?php $xml=<<<XML<cars&
- 这篇文章主要介绍了Python测试线程应用程序过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言使用np.savetxt()方法可以将数据保存为txt文件或者是csv文件。1 np.savetxt()存储txt文件1-1 基础参数n
- Python 中使用线程有两种方式:函数或者用类来包装线程对象。函数式:调用 thread 模块中的start_new_thread()函数
- 任何使用yield的函数都称之为生成器,如:def count(n): while n > 0: &nb
- 编号标准宗地编码(landCode)所在区段编码(sectCode)1131001BG001G0012131001BG002G0013131
- 参考服务器安装的是Centos 系统。uwsgi是使用pip安装的。nginx是使用yum install nginx安装。python 2
- 某人使用如下过滤代码,发现经常被黑:n=request.form("username") p=request.form(
- 前言闲暇时间抽个空写了个三国杀武将手册的小程序,中间有个需求设计的是合成武将皮肤图、竖排的武将姓名、以及小程序码,然后提供保存图片到相册,最
- 之前一直对于python类的继承机制认知的比较混乱,今天学习记录一下。(1)首先使用直接继承的方式class parent():  
- 两个例子package main import ( "fmt" "time")func Proces