首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将RSA公钥转换为RSA DER

将RSA公钥转换为RSA DER
EN

Stack Overflow用户
提问于 2010-07-02 06:30:16
回答 2查看 40.6K关注 0票数 17

我有由ssh- id_rsa.pub生成的密钥。如何以编程方式将id_rsa.pub文件转换为RSA DER格式的密钥?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-02 08:43:34

如果使用ssh-keygen生成密钥:

代码语言:javascript
复制
$ ssh-keygen

然后,您可以使用openssl提取公钥,并将其写入DER格式,如下所示:

代码语言:javascript
复制
$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout
writing RSA key

您可以使用PEM查看DER输出,如下所示:

代码语言:javascript
复制
$ openssl rsa -in pub.der -inform DER -pubin -text

我不使用Ruby,所以我不知道在Ruby中使用OpenSSL有多容易。

编辑:我回答得太快了--您编写了id_rsa.pub,而您可能没有id_rsa本身。另一个堆栈溢出问题是反向转换,但那里的源代码可能会有所帮助:Convert pem key to ssh-rsa format一旦您有了PEM,就可以使用openssl将PEM转换为DER。

编辑,2014年5月: Ruby已经成为我最喜欢的编程语言,最初的问题(编辑后)问到了Ruby。下面是读取id_rsa.pub (公钥)并写入OpenSSL生成的、DER格式的公钥的代码:

代码语言:javascript
复制
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 }

您可以在shell中使用以下openssl命令检查输出:

代码语言:javascript
复制
$ openssl rsa -pubin -text -in id_rsa.pem
$ openssl rsa -pubin -text -inform DER -in id_rsa.der
票数 32
EN

Stack Overflow用户

发布于 2013-08-18 00:06:49

如果您只能访问ssh-keygen生成的公钥,并且希望将其转换为DER格式,则可以使用以下方法:

ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER

它首先使用ssh-keygen将密钥转换为PKCS8 PEM格式,然后使用openssl pkey将其转换为DER格式。

(这样做的结果与Jim Flood的答案相同,但不涉及私钥文件。)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3162155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档