正如 Maarten Bodewes 的评论中所述,使用 OpenSSL 可以将 PKCS#8 格式的加密私钥转换为 PKCS#1 格式的私钥(均为 PEM 编码)。但这也可以通过密码学库来完成。
密码学库支持导入 PKCS#8 格式、PEM 编码的(加密)私钥,方法为load_pem_private_key() https://cryptography.io/en/latest/hazmat/primitives/asymmetric/serialization/?highlight=load_pem_private_key#cryptography.hazmat.primitives.serialization.load_pem_private_key(从0.6版本开始),例如:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
pkcs8Encrypted = b"""-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICzzBJB...
-----END ENCRYPTED PRIVATE KEY-----"""
privateKey = serialization.load_pem_private_key(
pkcs8Encrypted,
b'mypassword',
default_backend()
)
可以使用 PKCS#1 格式导出 PEM 编码的私钥private_bytes() https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/?highlight=private_bytes#cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey.private_bytes(从0.2版本开始):
pkcs1 = privateKey.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
print(pkcs1.decode('utf-8')) # -----BEGIN RSA PRIVATE KEY-----...
密码学的当前版本是 3.4.7(2021 年 3 月)。 2.8 是从 2019 年 10 月开始,第 2.8 条。发布历史 https://pypi.org/project/cryptography/#history。实际上,这两种方法都应该可用。