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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
python http接口自动化脚本详解
Jan 02 Python
wxpython实现图书管理系统
Mar 12 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
python 杀死自身进程的实现方法
Jul 01 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
pytorch 归一化与反归一化实例
Dec 31 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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连接Oracle数据库
2006/10/09 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
基于Require.js使用方法(总结)
2017/10/26 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
运动会闭幕式解说词
2014/02/21 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
单位工资证明范本
2015/06/12 职场文书
2016特色励志班级口号
2015/12/24 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
SQL中的三种去重方法小结
2021/11/01 SQL Server