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程序抓取网页的HTML信息的一个小实例
May 02 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Python基础之函数的定义与使用示例
Mar 23 Python
Django框架表单操作实例分析
Nov 04 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Python callable内置函数原理解析
Mar 05 Python
django的403/404/500错误自定义页面的配置方式
May 21 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入门基础之php代码写法
2011/12/30 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
Python实现多线程抓取妹子图
2015/08/08 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
5款实用的python 工具推荐
2020/10/13 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
学年末自我鉴定
2014/01/21 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js