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

在两种情况下,从私钥生成的公钥不同

艾敏学
2023-03-14

我试图生成私钥和公钥对。我想使用私钥签署我的JWT,并将公钥发送给第三方来解码我的JWT。

在mac os终端上,我生成了如下密钥:

ssh-keygen-m PEM-t rsa-b 2048

现在我有了pkey吗

rsa_private=OpenSSL::PKey::rsa。新建(File.read(“/path/to/private/key/pkey”))

你是私人的。要\u s
“----开始RSA私钥------\n开始RSA私钥------\n结束RSA私钥------\n”

现在在rails中,我可以从生成的私钥中获取公钥,如下所示:

pub_key=rsa_private。公钥

但当我试图打印它的内容时,它与pkey中的内容不同。运行ssh-keygen命令时生成的pub。

pub_key看起来像这样:

“----开始公钥------\n某些\u内容\n------结束公钥------\n”

但是我的爸爸。发布文件看起来不同,类似于以下内容:

ssh-rsaSOME_OTHER_CONTENTuser@user.local

所以,我的问题是,如何为同一私钥获得两个不同的公钥?我用哪一个来解码我的JWT?

共有1个答案

欧阳博超
2023-03-14

密钥应该相同,但编码方式不同。

RSA密钥对由多个数字组成,私钥是所有这些数据,公钥是相同的,私钥部分被删除。

数字可以以不同的顺序书写,以不同的格式编码。密钥也可以用密码加密存储(不是这种情况)。因此,具有相同键的文件看起来绝对不同。

PEM格式(带有BEGIN PUBLIC KEY和Base64数据的格式)对于通用密钥更为常见,因此最好使用它。

更新:PEM格式是带页眉和页脚的Base64编码DER。DER反过来是ASN.1的二进制表示。但是SSH使用更复杂的密钥编码格式(RFC4716)

例子:

% ssh-keygen -m PEM -t rsa -N '' -b 1024 -f ./rsa

% cat rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDRNFYxsULk6x90T0EE8iS3skfJJ407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlpLjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+HQU3IzyU1i0X9K828Q== vasfed@Vasiliys-MacBook-Pro.local

% ssh-keygen -e -m PEM -f ./rsa.pub
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBANE0VjGxQuTrH3RPQQTyJLeyR8knjTt5/dYkkKWt7STawslQlfr9dtzc
5vE2OLFdyAhenYfihU6c2m6OoUX9czzXOWkuMZP/iKC0rUWMgchoXJGF4a7CmWDA
KReXEB7+gfUFvicVeUP+Q5GYaBJ9IT0Gkf4dBTcjPJTWLRf0rzbxAgMBAAE=
-----END RSA PUBLIC KEY-----

% ssh-keygen -e -m PKCS8 -f ./rsa.pub
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRNFYxsULk6x90T0EE8iS3skfJ
J407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlp
LjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+
HQU3IzyU1i0X9K828QIDAQAB
-----END PUBLIC KEY-----

以上是同一密钥的3种不同编码,以下是后两种的ASN解码版本(通过https://lapo.it/asn1js):

PEM,最小值(模数和指数,无元数据):

SEQUENCE (2 elem)
  INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
  INTEGER 65537

PKCS8,这里我们看到完全相同的数字,但这一次有一些元数据:

SEQUENCE (2 elem)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
    NULL
  BIT STRING (1 elem)
    SEQUENCE (2 elem)
      INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
      INTEGER 65537
 类似资料:
  • 我以这种格式将私钥保存在DB中。 我需要从中提取公钥。openssl\u pkey\u get\u详细信息需要资源,但如何从字符串创建资源? 我试过这个 错误是openssl\u pkey\u get\u details()期望参数1是资源,给定布尔值 编辑1: 我试图从@kbarborak bellow获得解决方案,但$pk\u get是错误的: var_转储的输出为:

  • 以下网站经常被引用,而且我认为是准确的: https://gobittest.appspot.com/Address 我试图在Golang中重现这些步骤,但第一步就失败了:-( 有人能给我提供一个Golang片段,给定ECDSA私钥,返回公钥吗?我想我可能具体指的是上述站点示例中的私钥指数和公钥指数。 i、 例如,给定随机生成的(十六进制编码的)私钥(指数?)<代码>E83385AF76B2B19

  • 问题内容: 我试图从私钥生成公共ECDSA密钥,但是在Internet上如何进行此操作方面,我还没有找到太多帮助。几乎所有内容都是根据公共密钥规范生成公共密钥的,我不知道该如何获得。到目前为止,这是我汇总的内容: 但是,在运行时,出现以下错误: 我究竟做错了什么?有没有更好/更简便的方法可以做到这一点? 编辑:我设法获得一些代码进行编译,但不能正常工作: 当我运行它时,它会生成一个publicKe

  • 我正在Erlang中创建一个应用程序,给定一个RSA私钥,它可以返回RSA公钥和与该priv密钥相关联的x509公钥。 ----只是一个更新---- 在花了一些时间了解x509并阅读了Erlang public_key文档后,我找到了一个解决方案: 如果我可以通过简单地获取模数和publicExponent,从“RSaprivateKey”生成“RSapublicKey”,那么生成这两个键的代码如

  • 我有一个私钥(ecdsa,secp256r1)。 如何在没有充气城堡的情况下从Java中制作公钥?

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