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 相关文章推荐
记录Django开发心得
Jul 16 Python
python实现指定字符串补全空格的方法
Apr 30 Python
浅谈Python的异常处理
Jun 19 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
通过python爬虫赚钱的方法
Jan 29 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
tensorflow使用指定gpu的方法
Feb 04 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
Python使用pdb调试代码的技巧
May 03 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
python使用多线程查询数据库的实现示例
Aug 17 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用户注册时常用的检验函数实例总结
2014/12/22 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
Jqprint实现页面打印
2017/01/06 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
理解Python中函数的参数
2015/04/27 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Apache如何部署django项目
2017/05/21 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Django配置文件代码说明
2019/12/04 Python
通过python检测字符串的字母
2020/02/18 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
学校岗位设置方案
2014/01/16 职场文书
广告语设计及教案
2014/03/21 职场文书
2014年党务公开方案
2014/05/08 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
mysql函数之截取字符串的实现
2022/08/14 MySQL