如何使用pyopenssl解密RSA加密文件(通过PHP和OpenSSL)?

时间:2017-10-20 13:56:09

标签: python python-3.x encryption pyopenssl

简单的n00b问题:我试图复制PHP中openssl_private_decrypt函数的行为来解密供应商发送给我的文件,该文件是通过openssl_public_encrypt函数加密的。我正在使用python 3.4,因此我能看到的唯一库是pyopenssl,但它的级别足够低,我不能轻易找到如何做我想做的事情。它可能很简单,但有没有人有我想做的事情?

2 个答案:

答案 0 :(得分:1)

使用Cryptography module,可以安装:

$ pip install cryptography

假设您将私钥存储在名为" path / to / key.pem"的文件中,首先加载私钥:

from cryptography.hazmat.primitives import serialization 
with open("path/to/key.pem", "rb") as key_file: 
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None,
        backend=default_backend() 
    )

然后你解密:

plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA1()),
            algorithm=hashes.SHA1(),
            label=None
    )
)

答案 1 :(得分:0)

感谢@mnistic它可以工作,但有一些修改。这是最终的工作代码(您必须记住openssl_private_decrypt的默认值):

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding

# It's critical that the file be opened in mode "rb"!
with open("private.key", 'rb') as key_file:
  private_key = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())

with open('encrypted_file', 'rb') as encrypted_file:
  ciphertext = encrypted_file.read()

plaintext = private_key.decrypt(ciphertext, padding.PKCS1v15())

请注意ciphertext需要短于密钥的最大块大小(对于RSA,密钥中的位数除以8)。希望能帮助未来的Google员工!