2

我有一个 DER 格式的私钥。我正在尝试将其转换为 PEM 并同时使用密码加密私钥。

这是我用来转换和加密的 openssl 命令:

> openssl rsa -aes256 -inform der -in temp_key.der -outform pem -passout pass:<password>

我正在尝试在 Python 中实现类似的逻辑,其中我有 DER 格式的内存中密钥的数据。我想将其更改为 PEM,对其进行加密,然后存储到文件中。

我不太熟悉 Python 的 Crypto 库,而且我很难找出正确的方法来转换和加密我的关键数据。

4

3 回答 3

4

您可以在加密模块的帮助下加载 DER 密钥并将其转储为受密码保护的 PEM 密钥,如下所示:

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

private_key = serialization.load_der_private_key(
    der_data, # assuming that "der_data" variable contains your DER key
    password=None,
    backend=default_backend()
)

pem_encrypted = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.BestAvailableEncryption(b'mypassword')
)

print(pem_encrypted.decode()) # -----BEGIN ENCRYPTED PRIVATE KEY-----...
于 2019-07-31T08:12:04.787 回答
2

其他两个答案都对你有用。纯粹为了品种,我会添加我的。对于 RSA,我个人更喜欢使用PyCryptodome,因为它在 RSA 密码方面具有更多功能,并且它的 RSA 实例是用纯 python 编程的。

此代码应该适合您:

from Crypto.PublicKey import RSA

key = RSA.import(open('key.der', 'rb').read())

with open('key.pem', 'wb') as f:

    pem_key = key.export_key(passphrase='password')

    f.write(pem_key)
    f.close()

如果需要,您可以指定导出密钥的输出格式,但 PyCryptodome 目前默认为 PEM。

您可以分别在https://cryptography.iohttps://pycryptodome.readthedocs.io找到这两个库的完整文档。

于 2019-08-01T12:08:00.757 回答
1

使用 python 的密码学模块这是我达到的实现

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.serialization import load_der_private_key
from cryptography.hazmat.primitives import serialization


key = load_der_private_key(
            der_data, password=None, backend=default_backend())

password_protected_key = key.private_bytes(encoding=serialization.Encoding.PEM,
                                        format=serialization.PrivateFormat.TraditionalOpenSSL,
                                        encryption_algorithm=serialization.BestAvailableEncryption("password"))
于 2019-07-31T15:10:47.467 回答