Сгенерируйте открытый ключ x509 из закрытого ключа RSA в Erlang

Я создаю приложение на 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:

Учитывая, что я могу создать RSAPublicKey из RSAPrivateKey, просто получив модуль и publicExponent, мой код для генерации обоих ключей будет выглядеть так:

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"...>>}]

Спасибо.


person RobisonSantos    schedule 02.07.2012    source источник
comment
Вы имеете ввиду сертификат x509? Как вы думаете, зачем вам это нужно?   -  person President James K. Polk    schedule 03.07.2012
comment
Мне действительно нужен открытый ключ x509. Это еще один формат RASPublicKey, который в формате «PEM» будет «BEGIN PUBLIC KEY» вместо «BEGIN RSA PUBLIC KEY».   -  person RobisonSantos    schedule 03.07.2012


Ответы (1)


Очевидная вещь была бы такой:

public_key(#'RSAPrivateKey'{modulus = Mod, publicExponent = Exp}) ->
    #'RSAPublicKey'{modulus = Mod, publicExponent = Exp}.

Кажется, что создается действительная запись из:

public_key(public_key:pem_entry_decode(hd(public_key:pem_decode(element(2, file:read_file("<OTP Src Dir>/lib/public_key/test/public_key_SUITE_data/server_key.pem")))))).
person archaelus    schedule 02.07.2012