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 调用Java实例详解
Jun 02 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
Django ORM filter() 的运用详解
May 14 Python
python怎么自定义捕获错误
Jun 29 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python基于Faker假数据构造库
Nov 30 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
用php实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
python中字典dict常用操作方法实例总结
2015/04/04 Python
python 循环while和for in简单实例
2016/08/16 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python 处理图片像素点的实例
2019/01/08 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
《锄禾》教学反思
2014/04/08 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
音乐之声观后感
2015/06/04 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
java开发双人五子棋游戏
2022/05/06 Java/Android
python缺失值填充方法示例代码
2022/12/24 Python