我在 Erlang 中创建一个应用程序,给定一个 RSA 私钥,它可以返回 RSA 公钥和与该私钥关联的 x509 公钥。
我知道我可以通过从私钥获取模数和公共指数来生成 RSA 公钥。
--from OTP-PUB-KEY.hrl
-record('RSAPrivateKey',{
version, modulus, publicExponent, privateExponent, prime1, prime2, exponent1, exponent2, coefficient, otherPrimeInfos = asn1_NOVALUE}).
-record('RSAPublicKey',{
modulus, publicExponent}).
但是如何生成 x509 公钥?
我知道这是可能的,因为我用 perl 编写的旧代码曾经通过调用类似这样的方法来做到这一点:
$private = Crypt::OpenSSL::RSA->new_private_key( $hash_ref->{'private'} );
{rsa => $private->get_public_key_string(),
x509 => $private->get_public_key_x509_string()};
有谁知道该怎么做?
----- 只是一个更新 ----
在花了一些时间学习 x509 并阅读 Erlang public_key 文档后,我找到了一个解决方案:
鉴于我可以通过简单地获取模数和 publicExponent 从“RSAPrivateKey”生成“RSAPublicKey”,我生成这两个密钥的代码如下所示:
getPublicKeysFromPrivateKey(#'RSAPrivateKey'{modulus = M, publicExponent = PE}) ->
RSAPub = #'RSAPublicKey'{modulus = M, publicExponent = PE},
%% Encoding the keys
RSAPublicKey = public_key:pem_encode([public_key:pem_entry_encode('RSAPublicKey', RSAPub)]),
X509PublicKey = public_key:pem_encode([public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPub)]),
[{rsa, RSAPublicKey},{x509, X509PublicKey}].
这将产生:
[{rsa,<<"-----BEGIN RSA PUBLIC KEY----- \nMIGJAoGBAMU8ZcQ4S+gHDuZd6cEdqbf9l1Hw4fxQrJ455B2kJRUwyKidVbCH2omy\nI0SLNu92"...>>},
{x509,<<"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFPGXEOEvoBw7mXenBHam3/ZdR\n8OH8UKye"...>>}]
谢谢。