我在 python 中使用以下代码和 pyOpenSSL 创建了一个密钥对:
from OpenSSL import crypto
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 2048)
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题 - 但正如我刚刚发现的那样,我想我会添加一个答案。
使用 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
我希望这对将来的人有帮助,因为我有同样的需求,但找不到答案,所以我自己做了。我想我会和你分享。
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)