Преобразуйте открытый ключ RSA в RSA DER

У меня есть id_rsa.pub ключ, сгенерированный ssh-keygen. То, как я могу программно преобразовать id_rsa.pub файлы в RSA DER, отформатировало ключи?

17
задан Andrey Kuznetsov 15 August 2013 в 19:47
поделиться

1 ответ

Если вы используете ssh-keygen для генерации ключа:

$ ssh-keygen

Затем вы можете просто использовать openssl, чтобы извлечь открытый ключ и записать его в формате DER следующим образом:

$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout
writing RSA key

Вы можно просмотреть вывод DER как PEM следующим образом:

$ openssl rsa -in pub.der -inform DER -pubin -text

Я не использую Ruby, поэтому не знаю, насколько легко использовать OpenSSL из Ruby.

Edit: Я ответил слишком быстро - вы написали id_rsa.pub и, возможно, у вас нет самого id_rsa. Другой вопрос о переполнении стека касается обратного преобразования, но найденный там исходный код может помочь: Преобразование ключа pem в формат ssh-rsa После того, как у вас есть PEM, вы можете использовать openssl для преобразования PEM в DER.

Редактировать, май 2014 г .: Ruby стал моим любимым языком программирования, и исходный вопрос (после редактирования) был задан о Ruby. Вот код для чтения id_rsa.pub (открытый ключ) и записи открытого ключа, сгенерированного OpenSSL в формате DER:

require 'openssl'
require 'base64'

def read_length(s)
    # four bytes, big-endian
    length = s[0..3].unpack('N')[0]
end

def read_integer(s, length)
    # shift all bytes into one integer
    s[4..3 + length].unpack('C*').inject { |n, b| (n << 8) + b }
end

def cut(s, length)
    s[4 + length..-1]
end

def decode_pub(pub)
    # the second field is the Base64 piece needed
    s = Base64.decode64(pub.split[1])

    # first field reading "ssh-rsa" is ignored
    i = read_length(s)
    s = cut(s, i)

    # public exponent e
    i = read_length(s)
    e = read_integer(s, i)
    s = cut(s, i)

    # modulus n
    i = read_length(s)
    n = read_integer(s, i)

    [ e, n ]
end

def make_asn1(e, n)
    # Simple RSA public key in ASN.1
    e0 = OpenSSL::ASN1::Integer.new(e)
    n1 = OpenSSL::ASN1::Integer.new(n)
    OpenSSL::ASN1::Sequence.new([ e0, n1 ])
end

pub = File.read('id_rsa.pub')

asn1 = make_asn1(*decode_pub(pub))

# Let OpenSSL deal with converting from the simple ASN.1
key = OpenSSL::PKey::RSA.new(asn1.to_der)

# Write out the public key in both PEM and DER formats
File.open('id_rsa.pem', 'w') { |f| f.write key.to_pem }
File.open('id_rsa.der', 'w') { |f| f.write key.to_der }

Вы можете проверить вывод с помощью этих команд openssl в оболочке:

$ openssl rsa -pubin -text -in id_rsa.pem
$ openssl rsa -pubin -text -inform DER -in id_rsa.der
31
ответ дан 30 November 2019 в 11:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: