700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python——Crypto库实现公钥加密私钥解密

Python——Crypto库实现公钥加密私钥解密

时间:2019-08-15 19:43:40

相关推荐

Python——Crypto库实现公钥加密私钥解密

目录

RSA介绍openssl生成公钥和私钥python实现生成公私钥PKCS1_v1_5包数据加密以及解密导入相关包数据加密数据解密效果展示

Crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。

本文主要是Crypto RSA算法加密。

RSA介绍

RSA算法是一种非对称加密算法,即由一个私钥和一个公钥构成的密钥对,通过私钥签名,公钥验签,或者通过公钥加密,私钥解密。其中,公钥可以公开,私钥必须保密。

例:当小明给小红发送信息时,可以用小明自己的私钥签名,小红用小明的公钥验签,也可以用小红的公钥加密,小红用她自己的私钥解密,这就是非对称加密。相比对称加密,非对称加密只需要每个人各自持有自己的私钥,同时公开自己的公钥。

openssl生成公钥和私钥

使用openssl生成公钥和私钥:

首先,在命令行执行以下命令以生成一个RSA密钥对:

openssl genrsa -aes256 -out rsa-key.pem 2048

根据提示输入密码,这个密码是用来加密RSA密钥的,加密方式指定为AES256,生成的RSA的密钥长度是2048位。执行成功后,我们获得了加密的rsa-key.pem文件。

第二步,通过上面的rsa-key.pem加密文件,我们可以导出原始的私钥,命令如下:

openssl rsa -in rsa-key.pem -outform PEM -out rsa-prv.pem

输入第一步的密码,我们就可以获得加密后的私钥。

类似的,我们用下面的命令导出原始的公钥:

openssl rsa -in rsa-key.pem -outform PEM -pubout -out rsa-pub.pem

python实现生成公私钥

首先,需要安装Crypto库:

python3 -m pip install pycryptodome

from Crypto import Randomfrom Crypto.PublicKey import RSA# 获取一个伪随机数生成器random_generator = Random.new().read# 获取一个rsa算法对应的密钥对生成器实例rsa = RSA.generate(1024, random_generator)# 生成私钥并保存private_pem = rsa.exportKey()with open('rsa.key', 'wb') as f:f.write(private_pem)# 生成公钥并保存public_pem = rsa.publickey().exportKey()with open('rsa.pub', 'wb') as f:f.write(public_pem)

PKCS1_v1_5包

RSA PKCS#1 v1.5加密标准主要描述了如何使用RSA公钥密码体系加密、解密数据,以及数字签名的算法

数据加密以及解密

导入相关包

from Crypto import Randomfrom Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5import base64

数据加密

message = "This is a plain text."with open('rsa.pub', 'r') as f:public_key = f.read()rsa_key_obj = RSA.importKey(public_key)cipher_obj = PKCS1_v1_5.new(rsa_key_obj)cipher_text = base64.b64encode(cipher_obj.encrypt(message.encode()))print('cipher text: ', cipher_text)

数据解密

with open('rsa.key', 'r') as f:private_key = f.read()rsa_key_obj = RSA.importKey(private_key)cipher_obj = PKCS1_v1_5.new(rsa_key_obj)random_generator = Random.new().readplain_text = cipher_obj.decrypt(base64.b64decode(cipher_text), random_generator)print('plain text: ', plain_text.decode())

效果展示

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。