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中用keys()方法返回字典键的教程
May 21 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python实现飞机大战
Sep 11 Python
python os.path模块常用方法实例详解
Sep 16 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python判断有效的数独算法示例
Feb 23 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
详解Python IO口多路复用
Jun 17 Python
Python库安装速度过慢解决方案
Jul 14 Python
7个关于Python的经典基础案例
Nov 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
使用PHP制作新闻系统的思路
2006/10/09 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
Python实现的最近最少使用算法
2015/07/10 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Windows下python3.7安装教程
2018/07/31 Python
python 自动批量打开网页的示例
2019/02/21 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
会议通知
2015/04/15 职场文书
五一放假通知怎么写
2015/08/18 职场文书
创业计划书介绍
2019/04/24 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
php png失真的原因及解决办法
2021/11/17 PHP