Python如何基于rsa模块实现非对称加密与解密


Posted in Python onJanuary 03, 2020

这篇文章主要介绍了Python如何基于rsa模块实现非对称加密与解密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、简单介绍:

RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。

RSA密钥至少为500位长,一般推荐使用1024位。RSA密钥长度随着保密级别提高,增加很快。

由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序就会抛出异常。 ——来自大佬

2、代码实现:

来一段大佬的代码:

import rsa


# 一、生成公钥及私钥, 并保存
public_key, private_key = rsa.newkeys(1024) # 生成公钥和私钥
# 将生成的公钥和私钥进行转换,以便存储
pub = public_key.save_pkcs1()
pri = private_key.save_pkcs1('PEM') # save_pkcsl()是内置方法,其默认参数是‘PEM'
with open('pubkey.pem', mode='wb') as f, open('privkey.pem', mode='wb') as f1:
  f.write(pub) # 打开两个文件,分别存储公钥及私钥
  f1.write(pri)


# 二. 使用公钥加密, 私钥解密
def func():
  with open('pubkey.pem', mode='rb') as f, open('privkey.pem', 'rb') as f1:
    pub = f.read() # 从文件中再读出公钥和私钥
    pri = f1.read()
    public_key = rsa.PublicKey.load_pkcs1(pub) # 转换为原始状态
    private_key = rsa.PrivateKey.load_pkcs1(pri)
  message = "rsa加密测试"
  info = rsa.encrypt(message.encode('utf-8'), public_key) # 使用公钥加密内容,内容必须是二进制
  msg = rsa.decrypt(info, private_key) # 使用私钥解密,获得解密后的内容
  print(msg.decode('utf-8')) # 使用之前记得先解码

3、代码升级:

现在我将上述的代码段封装成一个Rsa class(包含的方法有:__init__——初始化方法,key_transform_store——存储公钥与私钥的方法、encry——加密方法、decry——解密方法),使用的时候,直接将下面的代码段拎到我们需要的地方去引用:先创建一Rsa对象,然后调用里面的方法即可:

import rsa


class Rsa(object):
  """RSA加密、解密"""

  def __init__(self, number, pub_path='public_key.pem', priv_path='private_key.pem'):
    """

    :param pub_path: the path to public key, default its path is public_key.pem
    :param priv_path: the path to private key, default its path is private_key.pem
    """
    # Generate the public and private keys, and returns them
    self.public_key, self.private_key = rsa.newkeys(number)

    self.public_key_path = pub_path
    self.private_key_path = priv_path

  def key_transform_store(self):
    """
    convert and save the generated public and private keys to a file
    :return: None
    """
    # convert the generated public and private keys for storage
    pub = self.public_key.save_pkcs1()
    pri = self.private_key.save_pkcs1('PEM')

    # open two files to store the public key and private key respectively
    
    with open(self.public_key_path, mode='wb') as f:
      f.write(pub)

    with open(self.private_key_path, mode='wb') as f1:
      f1.write(pri)

  def encry(self, info):
    """
    encrypt information
    :param info: the original string information to be encrypted
    :return:info_encrypted
    """
    # read the public key from the file
    with open(self.public_key_path, mode='rb') as f:
      pub = f.read()
      # convert pub to original state
      public_key = rsa.PublicKey.load_pkcs1(pub)

    # use the public key to encrypt the content, which must be binary
    info_encrypted = rsa.encrypt(info.encode('utf-8'), public_key)
    return info_encrypted

  def decry(self, info_encrypted):
    """
    decrypt information
    :param info_encrypted: encrypted information
    :return: info
    """
    # read the private key from the file
    with open(self.private_key_path, 'rb') as f:
      pri = f.read()
      # convert pri to original state
      private_key = rsa.PrivateKey.load_pkcs1(pri)

    # decrypt with private key to obtain the decrypted content
    msg = rsa.decrypt(info_encrypted, private_key)
    info = msg.decode('utf-8') # decode
    return info


rsa_obj = Rsa(1024) # 实例化
rsa_obj.key_transform_store() # 
info_encrypted = rsa_obj.encry('我是真心喜欢你的。') # 加密
print(info_encrypted)
info = rsa_obj.decry(info_encrypted) # 解密
print(info) # 我是真心喜欢你的。

这里会出现一个问题:由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序就会抛出异常。如下测试会抛出:

OverflowError: 189 bytes needed for message, but there is only space for 117

rsa_obj = Rsa(1024) # 实例化
rsa_obj.key_transform_store() # 
info_encrypted = rsa_obj.encry('我是真心喜欢你的。我是真心喜欢你的。我是真心喜欢你的。我是真心喜欢你的。我是真心喜欢你的。我是真心喜欢你的。我是真心喜欢你的。') # 加密
print(info_encrypted)
info = rsa_obj.decry(info_encrypted) # 解密
print(info)

后记: 通常使用中, 会先对数据进行bas64加密, 再对加密后的内容使用rsa加密, 最后对rsa解密后的内容进行bas64解密。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
实例讲解python函数式编程
Jun 09 Python
Python PyCharm如何进行断点调试
Jul 05 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
超实用的 30 段 Python 案例
Oct 10 Python
Pytorch之保存读取模型实例
Dec 30 Python
如何理解python中数字列表
May 29 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
详解python字符串驻留技术
May 21 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 #Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 #Python
pytorch AvgPool2d函数使用详解
Jan 03 #Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 #Python
Python基础之函数原理与应用实例详解
Jan 03 #Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 #Python
Python基础之高级变量类型实例详解
Jan 03 #Python
You might like
如何使用PHP往windows中添加用户
2006/12/06 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
php实现递归的三种基本方式
2020/07/04 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
Vue3为什么这么快
2020/09/23 Javascript
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
运动会邀请函范文
2014/02/06 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
关于环保的建议书
2014/05/12 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
浅析Django接口版本控制
2021/06/26 Python