如何在Python 3中使用RSA或类似加密?

时间:2017-05-28 03:17:22

标签: python-3.x encryption rsa public-key-encryption

如何在Python 3中使用RSA或类似的公钥 - 私钥加密,最好是内置模块?到目前为止我找到的所有资源都是用于Python 2.7

2 个答案:

答案 0 :(得分:1)

Python 3在其标准库中没有太多涉及加密的内容。相反,你得到哈希库 如果您需要安全哈希或消息摘要算法,那么Python的标准库已经涵盖了 hashlib 模块

如果您想使用RSA加密数据,那么您需要访问公共/私有RSA密钥对,或者您需要生成自己的密钥对。对于这个例子,我们将生成自己的。由于它很容易做到,我们将在Python的解释器中完成: 你必须先为python 3安装PyCrypto包

>>> from Crypto.PublicKey import RSA

>>> code = 'nooneknows'

>>> key = RSA.generate(2048)

>>> encrypted_key = key.exportKey(passphrase=code, pkcs=8, 

 protection="scryptAndAES128-CBC")

>>> with open('/path_to_private_key/my_private_rsa_key.bin', 'wb') as f:

 f.write(encrypted_key)

>>> with open('/path_to_public_key/my_rsa_public.pem', 'wb') as f:

 f.write(key.publickey().exportKey())

首先,我们从Crypto.PublicKey导入RSA。然后我们创建一个愚蠢的密码。接下来,我们生成2048位的RSA密钥。现在我们得到了好东西。要生成私钥,我们需要调用我们的RSA密钥实例的exportKey方法,并为其提供密码,使用哪种PKCS标准以及使用哪种加密方案来保护我们的私钥。然后我们将文件写入磁盘。

接下来,我们通过RSA密钥实例的publickey方法创建公钥。我们在这段代码中使用了一个快捷方式,只需使用publickey方法调用链接对exportKey的调用,也可以将其写入磁盘。

答案 1 :(得分:1)

这是我使用Python Crypto库(通过命令pip install pycryptodome安装)在Python 3中实现的RSA加密

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Random import new as Random
from base64 import b64encode
from base64 import b64decode

class RSA_Cipher:
  def generate_key(self,key_length):
    assert key_length in [1024,2048,4096]
    rng = Random().read
    self.key = RSA.generate(key_length,rng)

  def encrypt(self,data):
    plaintext = b64encode(data.encode())
    rsa_encryption_cipher = PKCS1_v1_5.new(self.key)
    ciphertext = rsa_encryption_cipher.encrypt(plaintext)
    return b64encode(ciphertext).decode()

  def decrypt(self,data):
    ciphertext = b64decode(data.encode())
    rsa_decryption_cipher = PKCS1_v1_5.new(self.key)
    plaintext = rsa_decryption_cipher.decrypt(ciphertext,16)
    return b64decode(plaintext).decode()

以下类的用法如下:

 - cipher = RSA_Cipher()
 - cipher.generate_key(1024) #key length can be 1024, 2048 or 4096
 - cipher.encrypt("hello world") #automatically uses generated key
 - cipher.decrypt("nt3vNNqzyAo2SINPgsb/eOLU2PD0DF0EstvnIHUmYGX4CVAvS0pDEboqGcuitYAzSV10Ii+fliwihu/L0ISrL6w/tRDQILHFM5PrN2pqzK+Lu6QHKUShFdQtikduo1KHXGlJNd25sVlDOhWAq/FK/67Yeoyz6fSP6PNXRjX7Q+Q=)