python RSA加密的示例


Posted in Python onDecember 09, 2020

RSA加密是一种非对称加密,通常使用公钥加密,私钥解密,私钥签名,公钥验签。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的.RSA算法通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。

RSA是一种公钥密码算法,加密算法是将明文m(m<n是一个整数)加密成密文c,即明文数字m的 E 次方求mod N,也就是将明文与自己相乘E次,然后结果除以N求余数,余数就是密文c,E和N组合就是公钥;解密算法为将密文c解密为明文m,即密文数字c的D次方求mod N,也就是将密文与自己相乘D次,然后结果除以N求余数,余数就是明文m,D和N组合就是私钥。

以下是关于RSA生成公钥私钥、加密、解密、加签、验签的示例。

1、生成公钥私钥:

from Crypto import Random
from Crypto.PublicKey import RSA
 
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
    f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
    f.write(public_pem)

生成的公钥私钥文件在项目路径下,也可以直接指定生成文件路径。

文件样例

python RSA加密的示例

生成的公钥私钥格式是固定的,秘钥中间无空格无换行,秘钥末尾也空格无换行,如下:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEedv+5NsbqAh6pjOMKF8I7FGa
et3QMUi0g5xDfQAM219qqXnoPi2hmCMjR8MWJV/zyMZ6IiRG/pvrZ2ZhfDNFdW3Z
SfHczRUvabABzWAr/57/eDBjswv4RQA+gUS6t8wFY/iV+O3i9+d79iN3VhUogfI3
3Ru3+RPFeFW88tYUhwIDAQAB
-----END PUBLIC KEY-----
 
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDEedv+5NsbqAh6pjOMKF8I7FGaet3QMUi0g5xDfQAM219qqXno
Pi2hmCMjR8MWJV/zyMZ6IiRG/pvrZ2ZhfDNFdW3ZSfHczRUvabABzWAr/57/eDBj
swv4RQA+gUS6t8wFY/iV+O3i9+d79iN3VhUogfI33Ru3+RPFeFW88tYUhwIDAQAB
AoGAApzaO5QAg+gioLroEZOR2/UEisjafUPCg0ACynT1lLYwGSOCzv9QrQbwZK42
HmvF0GCZnxMoJ1eIbEN2PZKgveQ/o4o8OdhuSk8pcDY72QwQHgSh1yfdvqkulo7D
vdmjz63DVSrknYRQFYSHIwUPVVTWyT80OTCYSn3JGqNKa9kCQQDZUbtlBvcPzP4T
5hRaH9XvCh3PPusQKGPzVRVLn+qZ30N2PNgttYKRMshlz1WMts2ZAKr3b3BLT6GT
shE5KatfAkEA53JkuV1vUEMg5j1ClgrwTs65yLWb+NbLH84xekrkkSxCkVjE7J/N
QV7Uk87na49LuztBaECBmaZyTQnFKk7P2QJAMzcc18lVbmbcNipR/49jJquWrOHi
GfO64nzZwPHWIx9H0dSzCcquE7QJIF1Fhx0JxRYwNJIRv93rcVhU0MjuNwJAIgI/
JrXCC4sxpGNQC3gkA5CA4Cs/dfsp8cx8nLmwiFx2k6D1nseEg5yJpAZ9HuL5f9Of
MtB3uroohYVwAV1/UQJBAIZQkryoOJxPbfWvIIGBOAlS/QqfE5kLV+3L2RUtBlac
nJykMucrdDx1gVKgoREUElxpYtlWI17h9MeNXRICgIM=
-----END RSA PRIVATE KEY-----

2、加密(使用公钥加密)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
 
# 加密
message = "Hello,This is RSA加密"
rsakey = RSA.importKey(open("public.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey)     #创建用于执行pkcs1_v1_5加密或解密的密码
cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8')))
print(cipher_text.decode('utf-8'))

加密结果:

Y1oivzbBDIEWX+NaXYLCJo5A226TmuemketZMUM3U80Rw3gSETjG5rHQ+S++Yao+iGQ5jSJA2yjkDtDAjdvi2VUz15LRSkdeKoliWnWy93KKl+aNEsBl3SUicATUgfNWU5ILo+DiltpF79AfIEhPptAz7+gN11KAf5LjfcQZ2+0=

这里每次使用公钥加密后的结果都不一致,跟对数据的padding即填充有关。

 加密时支持的最大字节数与证书有一定关系。加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)

1024位的证书,加密时最大支持117个字节,解密时为128;

2048位的证书,加密时最大支持245个字节,解密时为256。

 如果需要加密的字节数超出证书能加密的最大字节数,此时就需要进行分段加密。

3、解密(使用私钥解密)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
 
# 解密
cipher_text = "Y1oivzbBDIEWX+NaXYLCJo5A226TmuemketZMUM3U80Rw3gSETjG5rHQ+S++Yao+iGQ5jSJA2yjkDtDAjdvi2VUz15LRSkdeKoliWnWy93KKl+aNEsBl3SUicATUgfNWU5ILo+DiltpF79AfIEhPptAz7+gN11KAf5LjfcQZ2+0="
encrypt_text = cipher_text.encode('utf-8')
rsakey = RSA.importKey(open("private.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey)      #创建用于执行pkcs1_v1_5加密或解密的密码
text = cipher.decrypt(base64.b64decode(encrypt_text), "解密失败")
print(text.decode('utf-8'))

解密结果,与加密前信息一致:

Hello,This is RSA加密

4、加签(使用私钥加签)

使用私钥加签,每次签名是一致的。

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.Hash import SHA
import base64
 
#加签
message = "This is a request message..."
rsakey = RSA.importKey(open("private.pem").read())
signer = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(message.encode("utf-8"))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
print(signature.decode('utf-8'))

签名结果:

fd99fQpbH48VT9YQKepyHSip9pwrJkm1PN3ZykHNrfTVk555fv392E7MtbIfcligOCWUx8nd3g+7J0Fo3x+9G1Y6MJs0CuMCbA4qulUMNGjzUpsN1URorMZfPKjPvhf22ARH9qZEnebQ7UUGO3ioy4nylZONb3Ldhga+PKyxYTM=

5、验签(使用公钥验签)

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.Hash import SHA
import base64
 
#验签
message_verify = "This is a request message..."
signature = "fd99fQpbH48VT9YQKepyHSip9pwrJkm1PN3ZykHNrfTVk555fv392E7MtbIfcligOCWUx8nd3g+7J0Fo3x+9G1Y6MJs0CuMCbA4qulUMNGjzUpsN1URorMZfPKjPvhf22ARH9qZEnebQ7UUGO3ioy4nylZONb3Ldhga+PKyxYTM="
rsakey = RSA.importKey(open("public.pem").read())
verifier = Signature_pkcs1_v1_5.new(rsakey)
hsmsg = SHA.new()
hsmsg.update(message_verify.encode("utf-8"))
is_verify = verifier.verify(hsmsg, base64.b64decode(signature))
print(is_verify)

验签结果:

True

以上就是python RSA加密的示例的详细内容,更多关于python rsa加密的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
python开发之thread线程基础实例入门
Nov 11 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python使用xslt提取网页数据的方法
Feb 23 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Python自动化测试PO模型封装过程详解
Jun 22 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
python中把元组转换为namedtuple方法
Dec 09 #Python
python不同版本的_new_不同点总结
Dec 09 #Python
python中_del_还原数据的方法
Dec 09 #Python
call在Python中改进数列的实例讲解
Dec 09 #Python
python中的对数log函数表示及用法
Dec 09 #Python
如何利用python正则表达式匹配版本信息
Dec 09 #Python
python基于win32api实现键盘输入
Dec 09 #Python
You might like
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
php递归创建目录的方法
2015/02/02 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
js定时器实例分享
2016/12/20 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python对Excel的读取的示例代码
2020/02/14 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
python的数学算法函数及公式用法
2020/11/18 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
军训 自我鉴定
2014/02/03 职场文书
协议书怎么写
2014/04/21 职场文书
保护环境建议书100字
2014/05/13 职场文书
班级心理活动总结
2014/07/04 职场文书
简短清晨问候语
2015/11/10 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL
Redis特殊数据类型bitmap位图
2022/06/01 Redis
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers