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正则表达式的使用范例详解
Aug 08 Python
Python全局变量操作详解
Apr 14 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
Python3.6简单反射操作示例
Jun 14 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
python实现windows壁纸定期更换功能
Jan 21 Python
python aiohttp的使用详解
Jun 20 Python
实例详解Python装饰器与闭包
Jul 29 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
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 Curl多线程原理实例详解
2013/11/06 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
显示js对象所有属性和方法的函数
2009/10/16 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
python去除所有html标签的方法
2015/05/05 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
大学教师师德师风演讲稿
2014/08/22 职场文书
个人投资合作协议书
2014/10/12 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
如何撰写创业策划书
2019/06/27 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
python异常中else的实例用法
2021/06/15 Python