从私钥生成的公钥在2种情况下有所不同

时间:2019-04-25 15:17:55

标签: ruby-on-rails macos openssl ssh-keys

我正在尝试生成私钥和公钥对。我想使用私钥对我的JWT进行签名,然后将公钥发送给第三方以对我的JWT进行解码。

在我的mac os终端上,我生成了这样的密钥:

  

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

现在我将pkey和pkey.pub分别设置为私钥和公钥。现在,在我的rails控制台中,我尝试获取像这样的私钥,它可以正常工作:

  

rsa_private = OpenSSL :: PKey :: RSA.new(File.read(“ / path / to / private / key / pkey”))

     

rsa_private.to_s
  “ -------开始使用RSA私有密钥--- \ nCONTENTS_OF_PKEY_FILE \ n -----结束RSA私有密钥----- \ n“

现在,我可以像这样从生成的私钥中获取公钥:

  

pub_key = rsa_private.public_key

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

pub_key看起来像这样:

  

“ -------公共公钥----- \ nSOME_CONTENT \ n ----- END公钥----- \ n”

但是我的pkey.pub文件看起来有所不同,如下所示:

  

ssh-rsa SOME_OTHER_CONTENT user@user.local

那么,我的问题是,如何为同一个私钥获取2个不同的公钥?我该使用哪一个来解码我的JWT?

1 个答案:

答案 0 :(得分:0)

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

一个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