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 相关文章推荐
跟老齐学Python之坑爹的字符编码
Sep 28 Python
python常用知识梳理(必看篇)
Mar 23 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
Django 大文件下载实现过程解析
Aug 01 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
python基础之停用词过滤详解
Apr 21 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
文章推荐系统(三)
2006/10/09 PHP
学习php分页代码实例
2013/10/24 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
全面了解js中的script标签
2016/07/04 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
postman和python mock测试过程图解
2020/02/22 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
python和js交互调用的方法
2020/06/23 Python
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
简历里的自我评价
2014/01/31 职场文书
财务主管岗位职责
2014/02/28 职场文书
如何写自我鉴定
2014/03/19 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
会计学自荐信
2014/06/03 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
新员工试用期自我评价
2015/03/10 职场文书
怎样写好工作计划
2019/04/10 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers
Java实现带图形界面的聊天程序
2022/06/10 Java/Android
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript