背景:工作需要,部分数据进行了加密传输,对方使用了RSA对密码进行了加密,需要获取到解密的数据。

目标:在已知公钥,私钥的情况下,使用python对其进行解密。

RSA加密

一、遇到的问题

收到加密的文件与加密密钥,如下。需要通过密钥对信息进行解密。

已知是RSA进行的加密数据。

json = {

'PUBLIC_KEY' :'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz4C8rDjl6NAAvdUxLl7p8eA+xxc4Sa20puq2gFPk+8B5W30o+8xAaktLoji9wEsf7WTEllxZcIXw7d4K9b1M34ZDQT1iR4ZreB3GkxEXDeQIV3f/W7C3NL1bF5ePn7DRGZYKTEry8pp/lK/1ESP9Z+giaN29xm+jsmvNAOJlLjndn8nYcmA1sdDzuX8JSlZOiijAwyKUkwrBd+FqlhbAfF9ebcEgQcRISZsBMpcsZ66HQ0nvEnhmLzkfXxLUu2w7ccwLc/W7a4V1SNFEMZifRyiI7IhYYpRFw7egQN2RgzVWW/O6HKzk2Mxaz/6Y+HEehuDfRDn5MjMCkhnfbpRKKwIDAQAB',

'PRIVATE_KEY' : 'MIIEowIBAAKCAQEAz4C8rDjl6NAAvdUxLl7p8eA+xxc4Sa20puq2gFPk+8B5W30o+8xAaktLoji9wEsf7WTEllxZcIXw7d4K9b1M34ZDQT1iR4ZreB3GkxEXDeQIV3f/W7C3NL1bF5ePn7DRGZYKTEry8pp/lK/1ESP9Z+giaN29xm+jsmvNAOJlLjndn8nYcmA1sdDzuX8JSlZOiijAwyKUkwrBd+FqlhbAfF9ebcEgQcRISZsBMpcsZ66HQ0nvEnhmLzkfXxLUu2w7ccwLc/W7a4V1SNFEMZifRyiI7IhYYpRFw7egQN2RgzVWW/O6HKzk2Mxaz/6Y+HEehuDfRDn5MjMCkhnfbpRKKwIDAQABAoIBAD7xpkn32IYO0qrDCPAwCnc8ts5d1M1EzA/2EvZKfKOBd06xYMVA6ClWPdMvsx+pqj2w25Fg4iCoALWnLVvt2GvVpoEbxbw8ok0Fez8RaBTmn0EpPWTq7igpaIB3kTG3yTYhtW3/LkM5aooH9icE69GhMQ7udKrFIrr0yHMEOf0TNKBUNlwwHWJrpUuodXxIbERonkNdri1AnsWsnh4ePkKFlgaIdOZ24W4kHjfQAQkz3bPTjRzU5Q0LpkCpuYxk+TeOvR5tNPHXtzTWYek7JbCbnIKr1SiJx+ncwWM7QEnuvbzCU2VeTwb6Rq94WIg3RpfqSKJPr5w5e/df4jmi58ECgYEA74ty4UiChdp27/xvy2sJMilgkcL5Z0A+McPrjM82CqfPvr1+ZMBkTwuQGxFWlNtdE7DLpneVCWmzAexUJ02dFndSJMqsN81335VYfLc94qk5HXwmc9UBK7+qL2Ugyz76KoRGogqkKYw0ZR2kdpcNoXjQfeVgqrumt+jnZChpAl8CgYEA3cHPuDbdqqhcslz4+Zz8B0zWKN8Kj5CgG9ReEmJGpE6w5D7bds5iPcmp5xwFctuumAtroA/+bpGX/2oXc1nXucf/dI3AWoaBQrZ9iL6xfe7+ZPiRYuZjz3ygZ+Vcgp6xixbTT86jaIHwsD1wYtzOiiYOUBt4jDk89xookjpBg7UCgYEAtCriQOdUpHBoPKBVRV5AEGZmp7tJ8oqzPKLrK4E+WE1XR1MnGYhK6dj8jh9AS72iCAlVYuNWSToi1TN3KAiMOjWMpvd5CI+VtaiSYVtBRJWay75w/XYb51fFHNinDbdUWV4b8gym5Ej7r4HYDQoXyncf+VDooAF7p5+ZSg/Ky2kCgYAlVsv+Dab3ZE/vbH4zsX4yUHrC+QNTNxvuc6y/VbLlWaapV/gmIgwisUEde/di5qCYU1v04JyLy5IXXKrELn2Hd6iI3JFl7L35GLc8fjdup/5HzB7W00o9FpP/ynvwNn5YmChOiNG0+CQp2L6CtwFD+7JvRKDgo4ajaNEqBgsf/QKBgE6kbfW6FSpFdOs+2qpIXTEWnTqUC3WD1h1qB8G8J3Tn/o/bSm8C5lHmjmg9vRJtHisaoLyc2ikH7UZwPGU32340s22igkDZml730CKrYtnnBZAG+tIiERtI4Zj432X7qzBYgTgwO7wRAvds+WDCwwV5FMGNCzbPEXos8HmS0812'

}

message = 'qFH2uuSYzDrxZ+MiQS/s/zRr5oOm/jfkCOYmJs+X/5elStsWkoVDxp6ONQFddLRi0Y797BMuE+yDwgPz73SLKnJcB3H9i/hxRO3VYZ1x6UdT1i7jypDm7dbfyJ0HNv8aL/1luOgSIRgLXoHg42SnY8xdpGsog77tKDl5NYlTfxCelMifMhLbhBCVtUPzKy75vhBXndUxzIThZynUeWa8CuyJSUmTmAnr/Qrq7BGo859NX8YXpjG9PdxoV00I67mtvuZXTkE295XnRbBAFRuuNlSTPjj/bXQp1cggy25f831NW0DdWy6pcH34HCTpP8eoJ2UaGsOQtEFYIHS2WfirFA=='

二、RSA算法简介

RSA 非对称加密算法

RSA是一种公钥密码算法,RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也就是将明文和自己做E次乘法,然后再将其结果除以 N 求余数,余数就是密文。RSA是一个简洁的加密算法。E 和 N 的组合就是公钥(public key)。

对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥(private key)

总结

1、乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

2、甲方获取乙方的公钥,然后用它对信息加密。

3、乙方得到加密后的信息,用私钥解密

原理详解

三、准备工作

网上查询资料后,了解到

windows上使用的是pycryptodome包。------ pip install pycryptodome

Linux上使用pycrypto包。------ pip install pycryptodome

pycryptodome的更新选择

但是自己测试后,发现python3.7上直接调包Crypto也可以直接使用。

from Crypto import Random

from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5

from Crypto.PublicKey import RSA

四、开始解密

首先对密钥进行提取。

Crypto包中对密钥有格式要求,如下所示

python实现RSA解密

#-----------------------------------生成的公私钥文件类似于如下形式-------------------------------------------------------

# 私钥

-----BEGIN RSA PRIVATE KEY-----

MIICX......./fx7KHM=

-----END RSA PRIVATE KEY-----

#公钥

-----BEGIN PUBLIC KEY-----

MIGDA.......AQAB

-----END PUBLIC KEY-----

那么读取文件

PUBLIC_KEY = r'-----BEGIN PUBLIC KEY-----\n{}\n-----END PUBLIC KEY-----\n'.format(json['PUBLIC KEY'])

RIVATE_KEY = r'-----BEGIN RSA PRIVATE KEY-----\n{}\n-----END RSA PRIVATE KEY-----\n'.format(json['PRIVATE KEY'])

rsa_public_key = PUBLIC_KEY .encode('utf8')

rsa_private_key = RIVATE_KEY.encode('utf8')

同理加密信息也做同样的操作

cipher_text = message.encode('utf8')

解密处理

# -*- coding: utf-8 -*-

import base64

from Crypto import Random

from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5

from Crypto.PublicKey import RSA

rsakey = RSA.importKey(rsa_private_key)

cipher = Cipher_pkcs1_v1_5.new(rsakey)

random_generator = Random.new().read

text = cipher.decrypt(base64.b64decode(cipher_text), None)

print(text.decode('utf8'))

# 加大力度!!!

解密成功~~~

五、加密&解密-代码

利用random函数生成新的密钥。

# -*- coding: utf-8 -*-

import base64

from Crypto import Random

from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5

from Crypto.PublicKey import RSA

message = b"this is test"

random_generator = Random.new().read

rsa = RSA.generate(1024, random_generator)

rsa_private_key = rsa.exportKey()

rsa_public_key = rsa.publickey().exportKey()

rsakey = RSA.importKey(rsa_public_key)

cipher = Cipher_pkcs1_v1_5.new(rsakey)

cipher_text = base64.b64encode(cipher.encrypt(message))

print(cipher_text)

rsakey = RSA.importKey(rsa_private_key)

cipher = Cipher_pkcs1_v1_5.new(rsakey)

random_generator = Random.new().read

text = cipher.decrypt(base64.b64decode(cipher_text), None)

print(text.decode('utf8'))

六、注意的点

1、密钥要处理成python的格式。

2、密钥&加密信息要处理成字节的形式。

七、其他备注

加密解密:公钥加密,私钥解密

签名验签:私钥签名,公钥验签

RSA的签名/验证

python使用密钥加密的表述_python 利用Crypto进行RSA解密加密文件相关推荐

  1. 基于python的文件加密传输_python 利用Crypto进行AES解密加密文件

    背景:工作需要,部分数据进行了加密传输,对方使用了AES对密码进行了加密,需要获取到解密的数据. 目标:通过密钥成功解密文件. 关键词:AES_ECB,AES_CBC,Java和Python的AES加 ...

  2. python 利用Crypto进行AES解密加密文件

     前言:今天写一个程序的时候: 加密模式:AES/CBC/PKCS5Padding 加密初始化向量:长度为 16 的空字节数组 一直搞不懂长度为16的空字节数组怎么表示 然后我用ECB模式发现跟他给的 ...

  3. php利用openssl实现RSA非对称加密签名

    来源:http://www.webiji.com/archives/412 php利用openssl实现RSA非对称加密签名 1. 先用php生成一对公钥和私钥 $res = openssl_pkey ...

  4. python计算csv文件内的数据_Python利用pandas计算多个CSV文件数据值的实例

    功能:扫描当前目录下所有CSV文件并对其中文件进行统计,输出统计值到CSV文件 pip install pandas import pandas as pd import glob,os,sys in ...

  5. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例

    本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...

  6. python turtle画彩虹的代码_Python利用turtle库绘制彩虹代码示例

    语言:Python IDE:Python.IDE 需求 做出彩虹效果 颜色空间 RGB模型:光的三原色,共同决定色相 HSB/HSV模型:H色彩,S深浅,B饱和度,H决定色相 需要将HSB模型转换为R ...

  7. python高德地图api调用实例_Python 利用高德地图api实现经纬度与地址的批量转换...

    我们都知道,可以使用高德地图api实现经纬度与地址的转换.那么,当我们有很多个地址与经纬度,需要批量转换的时候,应该怎么办呢? 在这里,选用高德Web服务的API,其中的地址/逆地址编码,可以实现经纬 ...

  8. python生成20个随机数列表_Python利用random生成一个列表内的随机数

    首先,需要导入random模块:import random 随机取1-33之间的1个随机数,可能重复:random.choice(range(1,34)) print得到一系列随机数,执行一次得到一个 ...

  9. python将矩阵转化为图片_Python利用PIL将数值矩阵转化为图像

    要求:输入一个n*n的矩阵,矩阵包括从-1到1的浮点数,将其转化为可视化图像 调库 from PIL import Image import numpy as np import math 载入图像, ...

最新文章

  1. html 文件上传与移除,js jquery分别实现动态的文件上传操作按钮的添加和删除
  2. 雄鹰与蜗牛 2017-10-26
  3. WebKit 内核源码分析 (三) Page
  4. IIS下配置php运行环境
  5. 面试官 | 为什么用了索引之后,查询就会变快?
  6. Java多线程——FutureTask源码解析
  7. 多节点什么网络取得技术性突破_一对一直播源码构架的技术性要求以及一对一直播火爆的原因...
  8. Mysql8.0安装+navicat for Mysql安装+navicat for Mysql。
  9. 用Kotlin撸一个图片压缩插件ImageSlimming-导学篇(一)
  10. MPB:中国农科院李玉中组牧草种子内生真菌的分离、鉴定与保存方法
  11. 题2.pta数据结构题集-File Transfer (25分)
  12. ThinkBook 14P Win11网卡驱动掉了-解决方案
  13. ie浏览器点击打印没反应_ie浏览器无响应怎么回事?ie浏览器点击没有反应解决方法分享...
  14. C#中new一个对象的过程说明
  15. 关于“八音盒自定义弹奏”的一些想法
  16. mq选型:rocketMq和kafka对比
  17. Yet Another Crosses Problem
  18. 【PCL】PCL点云库介绍及VS环境配置
  19. 如何设置最美的win11桌面(附隐藏任务栏方法)
  20. 5个高清图片素材网站,免费商用,赶紧收藏~

热门文章

  1. Green Hills Software GHS MULTI安装过程介绍
  2. 玩转云网络,这里有一份VMware最强指南
  3. 生活要有新鲜感,麻烦给我来一杯依维世苏打水鸡尾酒
  4. bat批处理定时重启应用程序
  5. 毕业了,我是先择业,还是先就业
  6. erp中的:ATP、CTP、APS的概念
  7. 对于网络的相关概念的理解
  8. Java操作Neo4J就是这么简单,#yyds盘点#
  9. Win98 源代码(特别版)
  10. ie浏览器不使用代理设置