python使用密钥加密的表述_python 利用Crypto进行RSA解密&加密文件

本文介绍了如何在Python中使用Crypto库实现RSA加密和解密。首先阐述了RSA算法的基本原理,然后详细展示了如何从JSON数据中提取公钥和私钥,并对加密信息进行解密的过程。最后提供了加密和解密的代码示例。
摘要由CSDN通过智能技术生成

背景:工作需要,部分数据进行了加密传输,对方使用了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的签名/验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值