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 相关文章推荐
python脚本替换指定行实现步骤
Jul 11 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
谈谈Python中的while循环语句
Mar 10 Python
Python基础之函数的定义与使用示例
Mar 23 Python
python实现翻转棋游戏(othello)
Jul 29 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 Python
django项目中新增app的2种实现方法
Apr 01 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Pycharm快捷键配置详细整理
Oct 13 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 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
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
javascript object array方法使用详解
2012/12/03 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
npm全局环境变量配置详解
2020/12/15 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python生成密码字典的方法
2018/07/06 Python
基于python指定包的安装路径方法
2018/10/27 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
会计的岗位职责
2014/03/15 职场文书
教师对学生的评语
2014/04/28 职场文书
班级旅游计划书
2014/05/03 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
施工员岗位职责范本
2015/04/11 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
pytorch--之halfTensor的使用详解
2021/05/24 Python
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers