当前位置: 首页 > 知识库问答 >
问题:

用于OpenSSL生成PKCS#1/PEM格式RSA私钥的SHA256指纹的Ruby代码

步胜
2023-03-14

例如,给定以下使用OpenSSL::PKey::RSA生成的PKCS#1/PEM格式的RSA私钥。新(2048):

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArL7/qAft6XBmEP9JkadhsPYydS7V+wsOLQPpJbtRmvs7rDUG
5hagEjhMKolSksAL8Gh4ZR84iFnATv81xLzoKBbWtHfMmgOohrXJy3Xw1kRrJemh
ZLmoJDbFVyDiCXXIDpfLDxm/9jBFn+hUuESFXMIBpbjhFJ0t12HFqXwFmKVfkNbq
JhwKuq3AEylN8dWn3oQNz4rq2ZCZiqjNBo0X4hny0GlBGvPHADS9Fe8DX/yN8Ggj
IM7MvQeVi3uiZ0u1qhiK7wcaPoTEjXJH4NhbmzZjGRQ/2VznbeXCYdzWzfAHDWjS
ADT6895geYYHTAJi1v7qtBRP2sihpdBhIpihgwIDAQABAoIBADOWxtrzo0V338Nr
uhjZl/81R1RfrF/QqWcgJ9yw2GokZWnEXE8SqrNGRNjfMd3JpMcjK/FnJYby5s+w
v+oFUH/Ick5rCJtmREoWuDEfA9G5lRY5c42VNHW8NasTku2oUxqokmfsFLv9Jo3e
4I43SGyvM7a+Q9nYJvyPomw/MZyoKKUJr7Poa1lYAqFigIWCbU2C0c9sHhsVNQJZ
+t69y9DiNTX7VDRhj8UQ07H0qs8nG06bFjt411Z/jdsKvh59ucLGARHYS0t4OGcr
CkIRUYI1xPF2UPCnCB7EJoeUbJPxtGt9Qb1yrV8U6K2WtezO/Suld7u2u/lX/aey
urkUwAECgYEA47oeArcPVttOJjFRL+YX6g7ixfRblh5SaPxVB19gqN404KrWqPWD
JpdageERr/TprtSXw75B5YZzdE1HjS811RN0gwS7d47uYu41XB/glH0E1u23w5CN
ldVoUKRG5JrK/ebXzUaXTPSelPjDXuucGoNN5X2K7vWBf31qzwKGGAECgYEAwjFp
/w+4vURb1Zzsp2/lDI2Md2Kq49YKIWOYZkPPUtUK0Xoqm0oKZF1Vl04T8ANnSIKk
n1aiNnxwmaYaOMfB2UHVbDbE2F5yLYUIelzVaMqzanxPN5oq0NBCW8UUxE+GPan4
syz5rEzBz/hENR9oFnvxbxewJsR5UjD43wmiWYMCgYEAu/xj0bH0A6s9s+F6N6Ql
kZ2ALhEtmZqmROwn9NITJNNpqxzb3tXs0eqXWCfHRg1S6nOsZHWmSCbZH+S7cBzM
v3wz7gP2DRf8ScaCXe4iofEiEZpi3Bl0B4AHgKpbq1LsxvPMqTPgqjI0xp0kCjNM
xcYmg49DJUedAvUxOnnG4AECgYEAiPXs+jWOZ/6kfn5U8qqac0YKAdGXEWXOc0oZ
HFdLC/Kx1JhDII8R0UN6sGIi8a6U07FAhhjGA4O0rslVySIp+B7UdaQTJT9HbA9d
sV90LJp5++p8vIyBEhEwHCVdxi8IUMlmXIil9v2T3CgPgyAJe4Ii/+VHGbCMmIlt
nXDgDh0CgYEAlmko3ujnfoVwV3f92JgetIZx5IMe5rylJ5FjxyQ3dD3UEaEQgxoz
81j23ZSFVe4Mg8PzyxFgLgEZN7TVj/sjELqpRlRhZUu91io9FjGuU6XZNgfjRAhH
RbgFj9mnr8TV9kETuxXpoGaMD/7MVvetg8Qr1nxpi7m29Ao5L5R5h7g=
-----END RSA PRIVATE KEY-----

我可以使用openssl生成SHA256指纹:

$ openssl rsa -in rsa_private_test.pem -pubout -outform DER | openssl sha256 -binary | openssl base64
writing RSA key
8T0BsSCXlbxqFGekWsIuGhj6/ca/6VpLjDqzT4X3TBQ=

我如何在Ruby中做到同样的效果?我的假设是,这两种方法,即通过Ruby中的OpenSSL和OpenSSL应该产生相同的结果。

共有3个答案

崔宇
2023-03-14

因此,从另一个帖子和@Topaco的评论中,我发现了我做错了什么。

部分问题在于<代码>。hexdigest始终返回文本,openssl第二部分中的输出返回需要二进制格式的输出。您应该获得公钥的顺序,因为openssl命令的第一部分返回公钥。

你可以看到它现在正在工作...

pry(main)> sha256 = OpenSSL::Digest::SHA256.new
=> #<OpenSSL::Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
pry(main)> digest = sha256.digest(rsa_public.to_der)
=> "\xF1=\x01\xB1 \x97\x95\xBCj\x14g\xA4Z\xC2.\x1A\x18\xFA\xFD\xC6\xBF\xE9ZK\x8C:\xB3O\x85\xF7L\x14"
pry(main)> Base64.encode64(digest) 
=> "8T0BsSCXlbxqFGekWsIuGhj6/ca/6VpLjDqzT4X3TBQ=\n"

与我之前得到的相反。。。

pry(main)> digest = OpenSSL::Digest::SHA256.hexdigest(rsa_public.to_der).to_s
=> "f13d01b1209795bc6a1467a45ac22e1a18fafdc6bfe95a4b8c3ab34f85f74c14"
pry(main)> Base64.encode64(digest)
=> "ZjEzZDAxYjEyMDk3OTViYzZhMTQ2N2E0NWFjMjJlMWExOGZhZmRjNmJmZTk1\nYTRiOGMzYWIzNGY4NWY3NGMxNA==\n"
禄光霁
2023-03-14

对不起,我没有权限直接评论你的回答。

我也遇到了同样的问题,我也尝试了你的答案,但没有得到预期的答案。我可以知道你是怎么把rsa_公开的吗?非常感谢。

这是我的ruby代码:

pkey = OpenSSL::PKey::RSA.new(File.read('rsa_private_test.pem'))

sha256 = OpenSSL::Digest::SHA256.new

digest = sha256.digest(pkey.public_key.to_der)

puts Base64.encode64(digest) 
归建安
2023-03-14

您可以通过OpenSSL::Digest实现它:

require 'openssl'

pem = OpenSSL::PKey::RSA.new(2048)

fingerprint = OpenSSL::Digest::SHA256.new(pem.to_der).to_s
# => "9a7c94fd90bf88d0b52aa48739b552bc6afc39e4a7d6949aa0ad1c110852906d"
 类似资料:
  • 问题内容: 我有PEM格式+ PKCS#1(我想)的RSA公钥: 我想在Python中获取其ASN1编码版本的SHA1摘要。第一步应该是读取此密钥,但是我在PyCrypto中无法做到这一点: PyCrypto的文档说支持PEM + PKCS#1,所以我很困惑。我也尝试过M2Crypto,但事实证明M2Crypto不支持PKCS#1,而仅支持X.509。 问题答案: PyCrypto支持 PKCS#

  • 主要的问题是,我对C相当陌生,OpenSSL留档对我来说不够清晰,我尝试过使用读和写rsa键到C中的pem文件,但我不太明白。例如,函数如何创建私有和公共?而从何而来?pcszPassphrase的意义是什么? 我会解释,好像这是某种伪代码,这就是我想做的,粗体部分是我不知道如何做的: 生成私钥和公钥作为十六进制缓冲区(客户端) 基本上,我知道如何处理AES加密/解密和通信协议,反正他们已经实现了

  • 我有一个加密的私钥,我知道密码。 我需要用Java库解密它。 不过,我不想使用BouncyCastle,除非没有其他选择。根据之前的经验,变更太多,文档不足。 私钥的格式如下: 我相信密钥数据是Base64编码的,因为我在64个字符后看到。 我尝试了以下方法来解密密钥: 我得到这个例外 我是否将正确的参数传递给构造函数? 我怎样才能做到这一点? 我尝试了Ericsonn的建议,有一个小的变化,因为

  • 问题内容: 我有一个加密的私钥,并且知道密码。 我需要使用Java库对其进行解密。 不过,我宁愿不要使用BouncyCastle,除非没有其他选择。根据以前的经验,有太多更改,没有足够的文档。 私钥的格式如下: 我相信关键数据是Base64编码的,因为我看到的是64个字符。 我尝试了以下解密密钥: 我得到这个例外 我是否将正确的参数传递给构造函数? 我该如何工作? 我尝试了Ericsonn的建议,

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 如何从中转换rsa私钥。把格式改成。使用openssl api编程的PEM格式。我可以手动使用openssl exe进行转换。请以编程方式建议如何做到这一点。