pyOpenSSL 创建一个 pem 文件

Rat*_*Don 4 python pyopenssl

我在 python 中使用以下代码和 pyOpenSSL 创建了一个密钥对:

from OpenSSL import crypto
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 2048)
Run Code Online (Sandbox Code Playgroud)
  1. 现在如何从密钥对象创建私钥和公钥 .pem 文件?
  2. 如果有任何可用的教程,请告诉我。我没有找到。从手册中很难知道,因为我是 OpenSSL 的新手。
  3. 如果 RSA 中没有使用特定的唯一密钥,相同的代码将创建两个相同的密钥对的可能性有多大?

AJ *_*ter 9

我知道这是一个老问题 - 但正如我刚刚发现的那样,我想我会添加一个答案。

使用 Python 3.x 执行此操作的最简单方法是使用PyCryptodome

Python 中的(对于 2048 位密钥):

from Cryptodome.PublicKey import RSA
key = RSA.generate(2048)
pv_key_string = key.exportKey()
with open ("private.pem", "w") as prv_file:
    print("{}".format(pv_key_string.decode()), file=prv_file)

pb_key_string = key.publickey().exportKey()
 with open ("public.pem", "w") as pub_file:
    print("{}".format(pb_key_string.decode()), file=pub_file)
Run Code Online (Sandbox Code Playgroud)

如果要在 (Linux) 命令行上检查私钥,请使用:

$ openssl rsa -check -inform pem -noout -in private.pem 
RSA key ok
...
Run Code Online (Sandbox Code Playgroud)


小智 8

我希望这对将来的人有帮助,因为我有同样的需求,但找不到答案,所以我自己做了。我想我会和你分享。

1. 创建PEM文件

bio_pub = _new_mem_buf()  # Memory buffers to write to
bio_priv = _new_mem_buf()

helper = OpenSSL.crypto._PassphraseHelper(OpenSSL.crypto.FILETYPE_PEM, None)

pk = OpenSSL.crypto.PKey()
pk.generate_key(OpenSSL.crypto.TYPE_RSA, n)

# Convert from EVP_PKEY type to RSA type
rsa_pkey = _lib.EVP_PKEY_get1_RSA(pk._pkey)


result_code = _lib.PEM_write_bio_RSAPublicKey(bio_pub, rsa_pkey)
result_code = _lib.PEM_write_bio_RSAPrivateKey(
    bio_priv, rsa_pkey, _ffi.NULL, _ffi.NULL, 0,
    helper.callback, helper.callback_args)
Run Code Online (Sandbox Code Playgroud)

在这部分之后,您的缓冲区中将包含公钥和私钥。要将其作为字符串获取,您可以调用以下函数:

_bio_to_string(bio_pub), _bio_to_string(bio_priv)
Run Code Online (Sandbox Code Playgroud)

我将这些导入用于 OpenSSL.crypto 的特殊“私有”函数:

import OpenSSL
from OpenSSL._util import lib as _lib, ffi as _ffi
from OpenSSL.crypto import _new_mem_buf, _bio_to_string
Run Code Online (Sandbox Code Playgroud)