python rsa模块学习笔记

一. 简介与历史

Python-RSA的历史始于2006年。作为阿姆斯特丹大学的学生作业。它起初只是一个用于计算大素数以及使用这些大数进行RSA加密,解密,签名和验证的模块,它还包括生成公钥和私钥。

二. 安装

  1. 最简单的方式:pip install rsa
  2. 也可以通过pycharm安装 操作流程:file–> settings–>Project: untitled–>Project Interpreter–>点击右上角的 + -->搜索rsa并选择–> 点击左下角 INSTALL PACKAGE 等待安装完成即可。
  3. 通过git获取源码 git clone https://github.com/sybrenstuvel/python-rsa.git

三. 作用

  1. 在使用rsa前,我们必须的到一对密钥,及公钥和私钥(public key、 private key)
  2. public key用于加密消息,以便只能由private key的所有者读取。因此,它也称为encryption key(加密密钥)。解密消息只能使用私钥完成,因此也称为decryption key(解密密钥)。
  3. 发送者用private key 签名信息并生成sign,接收者接收到信息后,可以用sign和public key 来验证信息是否由发送者签名,以及信息是否被修改过。

四. 使用

  1. 使用rsa.newkeys()生成密钥对,
  2. 并用save_pkcs1方法,转换编码格式
    save_pkcs1(format:str=‘PEM’) 默认编码格式为PEM
    PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN RSA XXX KEY-----"开头, "-----END RSA XXX KEY-----"结尾,内容是BASE64编码.Apache和*NIX服务器偏向于使用这种编码格式.
    DER - Distinguished Encoding Rules,打开看是二进制格式,不可读,Java和Windows服务器偏向于使用这种编码格式.
  3. 将密匙以文件的形式保存到本地,通过字符写入操作
  4. 将公钥和私钥从文件中读取出来使用文件内容读取操作和PublicKey.load_pkcs1()以及PrivateKey.load_pkcs1()方法
import rsa
(pubkey, privkey) = rsa.newkeys(512)  # 创建公钥和私钥,512为设定你加密字符串的最大可支持加密长度为512位=64字节,你也可以按需设置任意长度,越长加密越慢,越短越快
# 将公钥和私钥以pem编码格式保存
pub = pubkey.save_pkcs1()
pri = privkey.save_pkcs1()
print(f"公钥初始的值为:{pubkey},以pem格式的保存后的数据为:{pub}")
print(f"私钥初始的值为:{privkey} \n 以pem格式的保存后的私钥数据为:{pri}")
#  打印结果
# 公钥初始的值为:PublicKey(7481244465315159030174941866408088977078689270761513884333182534899112302828868853012354970827459273420757239091319237996571359037764144367408861808720513, 65537)
# 以pem格式的保存后的公钥数据为:b'-----BEGIN RSA PUBLIC KEY-----\nMEgCQQCO14+r/YbVU9gmeglgJoi8PNUvVaLzRFOBi/dNN5muCB6kRCzBylNhWpMi\nGAKy+wNjY/V1JKp7eILkc3KyMHqBAgMBAAE=\n-----END RSA PUBLIC KEY-----\n'
# 私钥初始的值为:PrivateKey(7481244465315159030174941866408088977078689270761513884333182534899112302828868853012354970827459273420757239091319237996571359037764144367408861808720513, 65537, 3506665680913321791475716605798100085247726562224742435766529354251275320158796528099874018589937145723483840242318255274732417780923351826009689191428353, 5643184159408851232131776560683191883064718200648061020021754396931515736448351153, 1325713330273249992945906759133446589093679828123455507108369540590727121)
# 以pem格式的保存后的私钥数据为:b'-----BEGIN RSA PRIVATE KEY-----\nMIIBPAIBAAJBAI7Xj6v9htVT2CZ6CWAmiLw81S9VovNEU4GL9003ma4IHqRELMHK\nU2FakyIYArL7A2Nj9XUkqnt4guRzcrIweoECAwEAAQJAQvQ5jNWeYNoXJBnp0R7e\n0tT03GYYpkxtk/iGZ7RaxGNXkIecc0u+bg4kSXC8BpcxpVS7xqWIPO4+ognbOkUx\nAQIjAL5ffVWlM15Ijcy5isAEzO6UnspteTYaA1H098CNMrSgu7ECHwDAFXC9M3X5\nKGM7tRw7/Vb7hroNJ23crvKG7Y/N79ECImrGeC/PRq59FztaXd4xUxgFt8JmAHQ9\nxtrzAPq4t1XkSSECHwCEbkPMLi6oGbBQ+gz9Ty0pPToI16ZnADc1z5PV6AECIhGm\n7Hx73R+hCWXIih/bttl0W7hl6mlIOqZXo30IfFUPHtQ=\n-----END RSA PRIVATE KEY-----\n'
# 将公钥保存到文件 ,将字节写入文件需要加上decode('utf-8'),python3新增
with open("public.pub", 'w+') as file:  # public.pub,保存的文件名,可更改路径,这里保存在当前路径下file.write(pub.decode("utf-8"))
# 将私钥保存到文件
with open("private.pem", 'w+') as file:file.write(pri.decode('utf-8'))# 取出公钥
with open("public.pub", "r") as file_pub:# 从文件中读出数据pub_data = file_pub.read()# 将读出数据通过PublicKey.load_pkcs1()转换为公钥pubkey = rsa.PublicKey.load_pkcs1(pub_data)
# 取出私钥
with open("private.pub", "r") as file_pri:pri_data = file_pri.read()# 将读出数据通过PrivateKey.load_pkcs1()转换为私钥prikey = rsa.PrivateKey.load_pkcs1(pri_data)

五. 通过rsa加密解密

要加密或解密消息,需要使用rsa.encrypt()加密, rsa.decrypt()解密
假设小明想发送一条消息,只有小美可以阅读。

  1. 小明生成一个密钥对,并将公钥提供给小美。这样做是为了使小美知道密钥确实是小明提供的密钥
  2. 小美编写一条消息,并以UTF-8对其进行编码。RSA模块仅对字节进行操作,而不对字符串进行操作,因此此步骤是必需的。
  3. 小美使用小明的公钥加密消息,然后发送加密的消息。
  4. 小明收到消息,并用他的私钥解密。
import rsa
# 小明生成密钥对
(ming_pubkey, ming_privkey) = rsa.newkeys(512)
# 小美编写一条消息,并以UTF-8对其进行编码
message = 'hello dear xiaoMing!'.encode('utf-8')
# 小美使用小明的公钥加密消息,然后发送加密的消息
crypto = rsa.encrypt(message,  ming_pubkey)
# 小明收到消息,并用他的私钥解密
message = rsa.decrypt(crypto, ming_privkey)
print(message.decode('utf8'))# 打印结果:hello dear xiaoMing!

六. 通过rsa签名和验证

由于小明保管私密,小美知道他是唯一一个可以可以阅读该消息的人,小明也不能确切知道它是小美发送消息,因为她没有签名。所以我们需要运用到签名和验证

import rsa
# 使用rsa.sign()方法为邮件创建单独的签名
# 生成密钥对
(pubkey, privkey) = rsa.newkeys(512)
# 待加密字符串
message = 'Go left at the blue tree'
# 将消息使用私钥签名,这里使用SHA-512对消息进行哈希处理。其他哈希方法也是可能的.
signature = rsa.sign(message, privkey, 'SHA-512')# 可以在单独的操作中计算哈希和签名(即,用于在客户端计算机上生成哈希,然后在远程服务器上使用私钥签名)。要对消息进行哈希处理,请使用rsa.compute_hash() 函数,然后使用rsa.sign_hash()函数对哈希签名:
# 待加密字符串
message = 'Go left at the blue tree'
# 用rsa.compute_hash()生成哈希数据
hash = rsa.compute_hash(message, 'SHA-1')
# 使用私钥对哈希数据签名
signature = rsa.sign_hash(hash, privkey, 'SHA-1')# 验证签名,请使用rsa.verify() 方法。如果验证成功,此函数将返回True
result = rsa.verify(message, signature, pubkey)
print(result)
# 如果修改验证的message会报错,有兴趣的同学可以尝试下,我这里就不写了

文末

这些是我学习过程遇到了这个模块,自己进行的一些学习,记录了下来,以供有缘人参考,只写了些基本操作,想了解更多的请参考官方文档。
本文主要内容均来自于官方文档:https://stuvel.eu/python-rsa-doc/index.html
写作不易,且看且珍惜
转载前注明出处(虽然不会有人转载,大佬的样子还是要装下的!!!),谢谢

python rsa模块学习笔记相关推荐

  1. python zipfile模块学习笔记(一)

    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...

  2. #Python第三方模块学习笔记(四)——CSV模块功能及主要函数介绍

    声明:本篇文章为转载文章并附有自己的理解,如有冒犯请联系博主立马删除 源地址:https://blog.csdn.net/u012162613/article/details/41915859 1.c ...

  3. python里面temp是啥-Python tempfile模块学习笔记(临时文件)

    tempfile.TemporaryFile 如何你的应用程序需要一个临时文件来存储数据,但不需要同其他程序共享,那么用TemporaryFile函数创建临时文件是最好的选择.其他的应用程序是无法找到 ...

  4. python urllib模块学习笔记

    这个模块是最基本最常用的,以前看过,总结一下 # coding : utf-8 import urllib url = 'http://cnblogs.com' #代理服务器 proxies = {' ...

  5. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  6. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  7. Python基础语法学习笔记

    Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...

  8. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  9. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  10. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

最新文章

  1. Visual Studio Code / Roboware Studio调整字体大小,跳转等操作
  2. python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)
  3. discuz精仿OPPO社区主题模板
  4. java编程基础码_1.java编程基础
  5. Python文档学习笔记(1)--使用Python 解释器
  6. 多变量遗传算法python代码_遗传算法之Python实现代码
  7. java分布式面试题_2021,Java最全的分布式面试题合集附答案,共2w字!
  8. 2018美赛C题论文学习笔记1
  9. VC++每个版本对应的vcredist
  10. python pywifi模块——暴力破解wifi
  11. C# 编写小巧快速的 Windows 动态桌面软件
  12. 抢注小程序“诱饵”多 轻信者被“套路”
  13. arm 汇编指令 CPS
  14. 创新工场5位创业者2011创业感悟
  15. java 长字符串变短_如何将一个很长的String变短,再根据短的String还原?
  16. Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx)
  17. php session fixation,聊聊session fixation attacks
  18. iOS字体大小适配的几种方法
  19. 腾讯云域名如何绑定ip地址
  20. [BUUCTF]PWN——pwnable_orw

热门文章

  1. 模拟实现memcmp
  2. Excel高级图表制作②——帕累托图
  3. Bad notification for startForeground
  4. python切片逆序_python 中倒序切片
  5. Android 白天黑夜模式切换
  6. 一个Python自动提取内容摘要的实践
  7. 做国外Lead,你不懂这些概念就out了
  8. AR VR MR三者的区别
  9. 1米6农村放牛娃的奋斗历程:从同济、港理工,到清华、伯克利大学!
  10. Blazor是春天还是寒风里的挣扎