如何在Python 3中使用RSA或类似的公钥 - 私钥加密,最好是内置模块?到目前为止我找到的所有资源都是用于Python 2.7
答案 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=)