python使用rsa非对称加密过程解析


Posted in Python onDecember 28, 2019

这篇文章主要介绍了python使用rsa非对称加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、安装rsa

支持python 2.7 或者 python 3.5 以上版本

使用豆瓣pypi源来安装rsa

pip install -i https://pypi.douban.com/simple rsa

python使用rsa非对称加密过程解析

2、加密解密

2.1、生成公私钥对

import rsa

# 1、接收者(A)生成512位公私钥对
# a. lemon_pub为PublicKey对象, lemon_priv为PrivateKey对象
# b. 512为秘钥的位数, 可以自定义指定, 例如: 128、256、512、1024、2048等
lemon_pub, lemon_priv = rsa.newkeys(512)

此时的状态

python使用rsa非对称加密过程解析

2.2、发送者加密

# 2、发送者(B)使用接收者(A)的公钥去加密消息
# rsa只能处理字节类型, 故字符串类型需要转化为字节类型
love_talk = "Lemon little girl, I love you very much!".encode("utf-8")
cryto_info = rsa.encrypt(love_talk, lemon_pub)  # 使用接收者(A)的公钥加密

此时状态

python使用rsa非对称加密过程解析

2.3、接收者解密

# 3. 接收者(A)使用自己的私钥去解密消息
talk_real = rsa.decrypt(cryto_info, lemon_priv)
talk_real2 = talk_real.decode("utf-8")
print(talk_real2)

python使用rsa非对称加密过程解析

3、其他场景加密解密

import rsa

# 生成密钥
pubkey, privkey = rsa.newkeys(512)

# 保存密钥
print("==============保存密钥===============")
with open('public.pem' ,'w+') as f:
  f.write(pubkey.save_pkcs1().decode())
with open('private.pem' ,'w+') as f:
  f.write(privkey.save_pkcs1().decode())

#导入密钥
with open('public.pem' ,'r') as f:
  pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
with open('private.pem' ,'r') as f:
  privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())

"""
加密 RSA
"""
def rsa_encrypt(message):
  crypto_email_text = rsa.encrypt(message.encode(), pubkey)
  return crypto_email_text

text = rsa_encrypt("first test rsa")
print(text)

"""
解密
"""
def rsa_decrypt(message):
  message_str = rsa.decrypt(message,privkey).decode()
  return message_str

newmessage=rsa_encrypt("haha,one two three four smile!")
message = rsa_decrypt(newmessage)
print("\n",message)

"""
签名
"""

message = '这是重要指令:...'
crypto_email_text = rsa.sign(message.encode(), privkey, 'SHA-1')

"""
验证
"""
# 收到指令明文、密文,然后用公钥验证,进行身份确认
rsa.verify(message.encode(), crypto_email_text, pubkey)

4、加密过程的封装

# 导入base64模块来进行base64编码
import base64
import rsa

class HandleSign:
  # 定义服务器公钥, 往往可以存放在公钥文件中
  server_pub = """
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
    O3F7gs+7bzrgPsMl29LemonPYvIG8C604CprLittlenJpnhWu2lGirlWZyLq6sBr
    tuPorOc42+gInFfyhJAwdZB6Sqlove7bW+jNe5youDtU7very6Gx+muchGo8Dg+S
    kKlZFc8Br7SHtbL2tQIDAQAB
    -----END PUBLIC KEY-----
    """

  @classmethod
  def to_encrypt(cls, msg, pub_key=None):
    """
    非对称加密
    :param msg: 待加密字符串或者字节
    :param pub_key: 公钥
    :return: base64密文字符串
    """
    if isinstance(msg, str):      # 如果msg为字符串, 则转化为字节类型
      msg = msg.encode('utf-8')
    elif isinstance(msg, bytes):    # 如果msg为字节类型, 则无需处理
      pass
    else:                # 否则抛出异常
      raise TypeError('msg必须为字符串或者字节类型!')

    if not pub_key:           # 如果pub_key为空, 则使用全局公钥
      pub_key = cls.server_pub.encode("utf-8")
    elif isinstance(pub_key, str):   # 如果pub_key为字符串, 则转化为字节类型
      pub_key = pub_key.encode('utf-8')
    elif isinstance(pub_key, bytes):  # 如果msg为字节类型, 则无需处理
      pass
    else:                # 否则抛出异常
      raise TypeError('pub_key必须为None、字符串或者字节类型!')

    public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key) # 创建 PublicKey 对象
    #2.创建 PublicKey 对象
    #public_key_obj = rsa.PublicKey.load_pkcs1(pub_key)

    cryto_msg = rsa.encrypt(msg, public_key_obj) # 生成加密文本
    cipher_base64 = base64.b64encode(cryto_msg)  # 将加密文本转化为 base64 编码

    return cipher_base64.decode()  # 将字节类型的 base64 编码转化为字符串类型


if __name__ == '__main__':
  # 待加密字符串或者字节
  love_talk = "Lemon little girl, I love you very much!"

  #1.用自己生成的publickye测试下
  #lemon_pub,lemon_priv=rsa.newkeys(512)
  #lemon_pub2=lemon_pub.save_pkcs1()

  # 调用to_encrypt类方法来进行加密
  cryto_info = HandleSign.to_encrypt(love_talk)
  print(cryto_info)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用PDB简单调试Python程序简明指南
Apr 25 Python
详解Python的单元测试
Apr 28 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
python代码区分大小写吗
Jun 17 Python
零基础小白多久能学会python
Jun 22 Python
django rest framework使用django-filter用法
Jul 15 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 Python
Python遍历字典方式就实例详解
Dec 28 #Python
python基于opencv检测程序运行效率
Dec 28 #Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 #Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 #Python
Pytorch 之修改Tensor部分值方式
Dec 27 #Python
pytorch 实现tensor与numpy数组转换
Dec 27 #Python
Numpy与Pytorch 矩阵操作方式
Dec 27 #Python
You might like
非常好的php目录导航文件代码
2006/10/09 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python编码爬坑指南(必看)
2016/06/10 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
一百行python代码将图片转成字符画
2021/02/19 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python3中布局背景颜色代码分析
2020/12/01 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
先进集体获奖感言
2014/02/13 职场文书
建筑工地大门标语
2014/06/18 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
校长一岗双责责任书
2015/05/09 职场文书
网络营销实训总结
2015/08/03 职场文书
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers