Python3使⽤RSA⽣成公私钥对及相关使⽤
最近做的东西,部分数据需要⽤到公私钥处理,记录⼀下使⽤过程
RSA的⼆次封装
import rsa
class Rsa():
def__init__(self, public_key=None, private_key=None):
self.public_key = public_key
self.private_key = private_key
def createRsaKeysPem(self, public_pem_save_path='./public_key.pem', private_pem_save_path='./private_key.pem', byte=2048): '''⽣成公私钥对,并将其序列化保存为⽂件'''
(pub_key, pri_key)= wkeys(byte)
with open(public_pem_save_path,'wb+')as f:
f.write(pub_key.save_pkcs1('PEM'))
with open(private_pem_save_path,'wb+')as f:
f.write(pri_key.save_pkcs1('PEM'))
return(pub_key, pri_key)
def fromPemLoadRsaPubKey(self, path='./public_key.pem'):
'''从⽂件导⼊公钥'''
with open(path,'rb')as f:
pem = f.read()
self.public_key = rsa.PublicKey.load_pkcs1(pem)
return self.public_key
def fromPemLoadRsaPriKey(self, path='./private_key.pem'):
'''从⽂件导⼊私钥'''
with open(path,'rb')as f:
pem = f.read()
self.private_key = rsa.PrivateKey.load_pkcs1(pem)
return self.private_key
def encrypt(self, data, public_key=None):
'''使⽤公钥加密或验签,返回数据为bytes类型'''
if public_key is None:
public_key = self.public_key
pt(data, public_key)
def decrypt(self, data, private_key=None):
'''使⽤私钥解密或签名,返回数据为bytes类型'''
if private_key is None:
private_key = self.private_key
return rsa.decrypt(data, private_key)
_rsa = Rsa()# 单例模式
相关使⽤
## 将类Rsa中的_rsa导⼊,使⽤单例模式
_ateRsaKeysPem(byte=2048)# ⽣成公私钥对
public_key = _rsa.fromPemLoadRsaPubKey('./public_key.pem')# 导⼊
private_key = _rsa.fromPemLoadRsaPriKey('./private_key.pem')
data = b'你好世界!'# 要加密的数据,类型:bytes
## 简单加解密
e = _pt(data)# 加密或验签
print(e)
d = _rsa.decrypt(e)# 解密或签名
print(d)
## 计算耗时
import time
start = time.process_time()
for i in range(9000):
for i in range(9000):
e = _pt(data)
d = _rsa.decrypt(e)
end = time.process_time()
print(e)
print(d)
print('耗时:%.8fs'% end-start)
## 因为加密出来的数据是⼆进制数据,不能直接str()使其序列化来保存(因为加密出来的⼆进制数据有部分不在常⽤的编码集中,猜测:⽐如utf8⼀个字符占3个16进制字节,⽽这个加密数据使⽤str()后⼀个字符会有占4个字节的情况), 若要将⼆进制保存在excel中,可使⽤base64作为⼆进制数据和字符串的转换中介
from base64 import b64encode, b64decode
data_str ='你好世界!'
en = _pt(de('utf8'))# 数据转成bytes后加密
en_str = b64encode(en).decode('utf8')# 将加密后的⼆进制数据⽤base64编码并⽤utf8解码为字符串
print(en_str)
de_data = b64decode(de('utf8')))# 将字符串⽤utf8编码为bytes,再⽤base64的解码为⼆进制数据
python单例模式de = _rsa.decrypt(de_data).decode('utf8')# 将⼆进制数据解密,并⽤utf8解码为字符串
print(de)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。