【问题标题】:RSA Public Key formatRSA 公钥格式
【发布时间】:2012-09-26 19:44:44
【问题描述】:

在哪里可以找到有关 RSA 公钥格式的文档?

OpenSSH 格式化的 RSA 公钥:

SSH-RSA AAAAB3NzaC1yc2EAAAABJQAAAQB / nAmOjTmezNUDKYvEeIRf2YnwM9 / uUG1d0BYsc8 / tRtx + RGi7N2lUbp728MXGwdnL9od4cItzky / zVdLZE2cycOa18xBK9cOWmcKS0A8FYBxEQWJ / q9YVUgZbFKfYGaGQxsER + A0w / fX8ALuk78ktP31K69LcQgxIsl7rNzxsoOQKJ / CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr / QbrfB1WT6s3838SEaXfgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN + ffE7iiayQf / 2XR + 8j4N4bW30DiPtOQLGUrH1y5X / rpNZNlWW2 + jGIxqZtgWg7lTy3mXy5x836Sj / 6L P>

在 Secure Shell (RFC 4716 - The Secure Shell (SSH) Public Key File Format) 中使用的相同公钥格式:

---- BEGIN SSH2 PUBLIC KEY ----
AAAAB3NzaC1yc2EAAAABJQAAAQB/nAmOjTmezNUDKYvEeIRf2YnwM9/uUG1d0BYs
c8/tRtx+RGi7N2lUbp728MXGwdnL9od4cItzky/zVdLZE2cycOa18xBK9cOWmcKS
0A8FYBxEQWJ/q9YVUgZbFKfYGaGQxsER+A0w/fX8ALuk78ktP31K69LcQgxIsl7r
NzxsoOQKJ/CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr/QbrfB1WT6s3838SEaX
fgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN+ffE7iiayQf/2XR+8j4N4bW30DiPtOQ
LGUrH1y5X/rpNZNlWW2+jGIxqZtgWg7lTy3mXy5x836Sj/6L
---- END SSH2 PUBLIC KEY ----

与 RSA 公钥格式相同的公钥(注意 五个 -,没有空格):

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA+xGZ/wcz9ugFpP07Nspo6U17l0YhFiFpxxU4pTk3Lifz9R3zsIsu
ERwta7+fWIfxOo208ett/jhskiVodSEt3QBGh4XBipyWopKwZ93HHaDVZAALi/2A
+xTBtWdEo7XGUujKDvC2/aZKukfjpOiUI8AhLAfjmlcD/UZ1QPh0mHsglRNCmpCw
mwSXA9VNmhz+PiB+Dml4WWnKW/VHo2ujTXxq7+efMU4H2fny3Se3KYOsFPFGZ1TN
QSYlFuShWrHPtiLmUdPoP6CV2mML1tk+l7DIIqXrQhLUKDACeM5roMx0kLhUWB8P
+0uj1CNlNN4JRZlC7xFfqiMbFRU9Z4N6YwIDAQAB
-----END RSA PUBLIC KEY-----

base-64 编码数据的十六进制转储:

00 00 00 07 73 73 68 2d 72 73 61 00 00 00 01 25 00 00 01 00 7f 9c 09
8e 8d 39 9e cc d5 03 29 8b c4 78 84 5f d9 89 f0 33 df ee 50 6d 5d d0 
16 2c 73 cf ed 46 dc 7e 44 68 bb 37 69 54 6e 9e f6 f0 c5 c6 c1 d9 cb
f6 87 78 70 8b 73 93 2f f3 55 d2 d9 13 67 32 70 e6 b5 f3 10 4a f5 c3 
96 99 c2 92 d0 0f 05 60 1c 44 41 62 7f ab d6 15 52 06 5b 14 a7 d8 19 
a1 90 c6 c1 11 f8 0d 30 fd f5 fc 00 bb a4 ef c9 2d 3f 7d 4a eb d2 dc 
42 0c 48 b2 5e eb 37 3c 6c a0 e4 0a 27 f0 88 c4 e1 8c 33 17 33 61 38 
84 a0 bb d0 85 aa 45 40 cb 37 14 bf 7a 76 27 4a af f4 1b ad f0 75 59 
3e ac df cd fc 48 46 97 7e 06 6f 2d e7 f5 60 1d b1 99 f8 5b 4f d3 97 
14 4d c5 5e f8 76 50 f0 5f 37 e7 df 13 b8 a2 6b 24 1f ff 65 d1 fb c8 
f8 37 86 d6 df 40 e2 3e d3 90 2c 65 2b 1f 5c b9 5f fa e9 35 93 65 59 
6d be 8c 62 31 a9 9b 60 5a 0e e5 4f 2d e6 5f 2e 71 f3 7e 92 8f fe 8b

我有read that there are a couple of formats????

关键数据可以用三种通用方式编码:

  • 二进制 DER 编码格式。这有时称为 ASN.1 BER 编码
  • PEM 或 base64 格式。这是与 DER 编码文件相同的数据,但它以 base64 编码,带有额外的页眉和页脚行
  • XML 格式。

如果是ASN.1,十六进制肯定不像。

RSA 公钥的格式是什么?


另见

【问题讨论】:

    标签: encryption rsa public-key-encryption


    【解决方案1】:

    CRL,CRT,CSR,NEW CSR,PRIVATE KEY, PUBLIC KEY,RSA,RSA Public Key Parser的参考解码器

    RSA 公钥

    -----BEGIN RSA PUBLIC KEY-----
    -----END RSA PUBLIC KEY-----
    

    加密的私钥

    -----BEGIN RSA PRIVATE KEY-----
    Proc-Type: 4,ENCRYPTED
    -----END RSA PRIVATE KEY-----
    

    CRL

    -----BEGIN X509 CRL-----
    -----END X509 CRL-----
    

    阴极射线管

    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    

    企业社会责任

    -----BEGIN CERTIFICATE REQUEST-----
    -----END CERTIFICATE REQUEST-----
    

    新的企业社会责任

    -----BEGIN NEW CERTIFICATE REQUEST-----
    -----END NEW CERTIFICATE REQUEST-----
    

    PEM

    -----BEGIN RSA PRIVATE KEY-----
    -----END RSA PRIVATE KEY-----
    

    PKCS7

    -----BEGIN PKCS7-----
    -----END PKCS7-----
    

    私钥

    -----BEGIN PRIVATE KEY-----
    -----END PRIVATE KEY-----
    

    DSA 密钥

    -----BEGIN DSA PRIVATE KEY-----
    -----END DSA PRIVATE KEY-----
    

    椭圆曲线

    -----BEGIN EC PRIVATE KEY-----
    -----END EC PRIVATE KEY-----
    

    PGP 私钥

    -----BEGIN PGP PRIVATE KEY BLOCK-----
    -----END PGP PRIVATE KEY BLOCK-----
    

    PGP 公钥

    -----BEGIN PGP PUBLIC KEY BLOCK-----
    -----END PGP PUBLIC KEY BLOCK-----
    

    【讨论】:

      【解决方案2】:

      您不能只将分隔符从 ---- BEGIN SSH2 PUBLIC KEY ---- 更改为 -----BEGIN RSA PUBLIC KEY----- 并期望从一种格式转换为另一种格式就足够了(这就是您在示例中所做的)。

      This article 对这两种格式都有很好的解释。

      RSA PUBLIC KEY 中的内容更接近 PUBLIC KEY 的内容,但您需要偏移 ASN.1 结构的开头以反映 PUBLIC KEY 也有一个指示符说明哪种类型的事实关键是(见RFC 3447)。您可以使用openssl asn1parse-strparse 19 看到这一点,如this answer 中所述。

      编辑:编辑后,您可以使用grep -v -- ----- | tr -d '\n' | base64 -d | openssl asn1parse -inform DER 获取RSA PUBLIC KEY 结构的详细信息:

          0:d=0  hl=4 l= 266 cons: SEQUENCE          
          4:d=1  hl=4 l= 257 prim: INTEGER           :FB1199FF0733F6E805A4FD3B36CA68E94D7B974621162169C71538A539372E27F3F51DF3B08B2E111C2D6BBF9F5887F13A8DB4F1EB6DFE386C92256875212DDD00468785C18A9C96A292B067DDC71DA0D564000B8BFD80FB14C1B56744A3B5C652E8CA0EF0B6FDA64ABA47E3A4E89423C0212C07E39A5703FD467540F874987B209513429A90B09B049703D54D9A1CFE3E207E0E69785969CA5BF547A36BA34D7C6AEFE79F314E07D9F9F2DD27B72983AC14F1466754CD41262516E4A15AB1CFB622E651D3E83FA095DA630BD6D93E97B0C822A5EB4212D428300278CE6BA0CC7490B854581F0FFB4BA3D4236534DE09459942EF115FAA231B15153D67837A63
        265:d=1  hl=2 l=   3 prim: INTEGER           :010001
      

      要解码 SSH 密钥格式,您还需要使用 RFC 4251 中的数据格式规范,并结合 RFC 4253:

         The "ssh-rsa" key format has the following specific encoding:
      
            string    "ssh-rsa"
            mpint     e
            mpint     n
      

      例如,在开头,您会得到00 00 00 07 73 73 68 2d 72 73 61。前四个字节 (00 00 00 07) 给出了长度。剩下的是字符串本身:73=s, 68=h, ... -> 73 73 68 2d 72 73 61=ssh-rsa,后跟长度为 1 的指数 (00 00 00 01 25) 和长度为 256 的模数 (00 00 01 00 7f ... )。

      【讨论】:

      【解决方案3】:

      OpenSSL rsa-ssh 密钥的解码 base64 数据开始,我已经能够猜测一种格式:

      • 00 00 00 07:四字节长度前缀(7字节)

      • 73 73 68 2d 72 73 61: "ssh-rsa"

      • 00 00 00 01:四字节长度前缀(1字节)

      • 25:RSA 指数 (e):25

      • 00 00 01 00:四字节长度前缀(256字节)

      • RSA 模数 (n):

          7f 9c 09 8e 8d 39 9e cc d5 03 29 8b c4 78 84 5f
          d9 89 f0 33 df ee 50 6d 5d d0 16 2c 73 cf ed 46 
          dc 7e 44 68 bb 37 69 54 6e 9e f6 f0 c5 c6 c1 d9 
          cb f6 87 78 70 8b 73 93 2f f3 55 d2 d9 13 67 32 
          70 e6 b5 f3 10 4a f5 c3 96 99 c2 92 d0 0f 05 60 
          1c 44 41 62 7f ab d6 15 52 06 5b 14 a7 d8 19 a1 
          90 c6 c1 11 f8 0d 30 fd f5 fc 00 bb a4 ef c9 2d 
          3f 7d 4a eb d2 dc 42 0c 48 b2 5e eb 37 3c 6c a0 
          e4 0a 27 f0 88 c4 e1 8c 33 17 33 61 38 84 a0 bb 
          d0 85 aa 45 40 cb 37 14 bf 7a 76 27 4a af f4 1b 
          ad f0 75 59 3e ac df cd fc 48 46 97 7e 06 6f 2d 
          e7 f5 60 1d b1 99 f8 5b 4f d3 97 14 4d c5 5e f8 
          76 50 f0 5f 37 e7 df 13 b8 a2 6b 24 1f ff 65 d1 
          fb c8 f8 37 86 d6 df 40 e2 3e d3 90 2c 65 2b 1f 
          5c b9 5f fa e9 35 93 65 59 6d be 8c 62 31 a9 9b 
          60 5a 0e e5 4f 2d e6 5f 2e 71 f3 7e 92 8f fe 8b
        

      我可以从 RFC 4253 中找到最接近我的理论的验证:

      “ssh-rsa”密钥格式具体编码如下:

        string    "ssh-rsa"
        mpint     e
        mpint     n
      

      这里的 'e' 和 'n' 参数构成签名密钥 blob。

      但它没有解释长度前缀。


      获取我找到的随机RSA PUBLIC KEY(在问题中),并将base64解码为十六进制:

      30 82 01 0a 02 82 01 01 00 fb 11 99 ff 07 33 f6 e8 05 a4 fd 3b 36 ca 68 
      e9 4d 7b 97 46 21 16 21 69 c7 15 38 a5 39 37 2e 27 f3 f5 1d f3 b0 8b 2e 
      11 1c 2d 6b bf 9f 58 87 f1 3a 8d b4 f1 eb 6d fe 38 6c 92 25 68 75 21 2d 
      dd 00 46 87 85 c1 8a 9c 96 a2 92 b0 67 dd c7 1d a0 d5 64 00 0b 8b fd 80 
      fb 14 c1 b5 67 44 a3 b5 c6 52 e8 ca 0e f0 b6 fd a6 4a ba 47 e3 a4 e8 94 
      23 c0 21 2c 07 e3 9a 57 03 fd 46 75 40 f8 74 98 7b 20 95 13 42 9a 90 b0 
      9b 04 97 03 d5 4d 9a 1c fe 3e 20 7e 0e 69 78 59 69 ca 5b f5 47 a3 6b a3 
      4d 7c 6a ef e7 9f 31 4e 07 d9 f9 f2 dd 27 b7 29 83 ac 14 f1 46 67 54 cd 
      41 26 25 16 e4 a1 5a b1 cf b6 22 e6 51 d3 e8 3f a0 95 da 63 0b d6 d9 3e 
      97 b0 c8 22 a5 eb 42 12 d4 28 30 02 78 ce 6b a0 cc 74 90 b8 54 58 1f 0f 
      fb 4b a3 d4 23 65 34 de 09 45 99 42 ef 11 5f aa 23 1b 15 15 3d 67 83 7a 
      63 02 03 01 00 01
      

      来自RFC3447 - Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1

      A.1.1 RSA 公钥语法

      RSA 公钥应该用 ASN.1 类型 RSAPublicKey 表示:

        RSAPublicKey ::= SEQUENCE {
           modulus           INTEGER,  -- n
           publicExponent    INTEGER   -- e
        }
      

      RSAPublicKey 类型的字段含义如下:

      • modulus 是 RSA 模数 n。
      • publicExponent 是 RSA 公共指数 e。

      Using Microsoft's excellent (and the only real) ASN.1 documentation:

      30 82 01 0a       ;SEQUENCE (0x010A bytes: 266 bytes)
      |  02 82 01 01    ;INTEGER  (0x0101 bytes: 257 bytes)
      |  |  00          ;leading zero because high-bit, but number is positive
      |  |  fb 11 99 ff 07 33 f6 e8 05 a4 fd 3b 36 ca 68 
      |  |  e9 4d 7b 97 46 21 16 21 69 c7 15 38 a5 39 37 2e 27 f3 f5 1d f3 b0 8b 2e 
      |  |  11 1c 2d 6b bf 9f 58 87 f1 3a 8d b4 f1 eb 6d fe 38 6c 92 25 68 75 21 2d 
      |  |  dd 00 46 87 85 c1 8a 9c 96 a2 92 b0 67 dd c7 1d a0 d5 64 00 0b 8b fd 80 
      |  |  fb 14 c1 b5 67 44 a3 b5 c6 52 e8 ca 0e f0 b6 fd a6 4a ba 47 e3 a4 e8 94 
      |  |  23 c0 21 2c 07 e3 9a 57 03 fd 46 75 40 f8 74 98 7b 20 95 13 42 9a 90 b0 
      |  |  9b 04 97 03 d5 4d 9a 1c fe 3e 20 7e 0e 69 78 59 69 ca 5b f5 47 a3 6b a3 
      |  |  4d 7c 6a ef e7 9f 31 4e 07 d9 f9 f2 dd 27 b7 29 83 ac 14 f1 46 67 54 cd 
      |  |  41 26 25 16 e4 a1 5a b1 cf b6 22 e6 51 d3 e8 3f a0 95 da 63 0b d6 d9 3e 
      |  |  97 b0 c8 22 a5 eb 42 12 d4 28 30 02 78 ce 6b a0 cc 74 90 b8 54 58 1f 0f 
      |  |  fb 4b a3 d4 23 65 34 de 09 45 99 42 ef 11 5f aa 23 1b 15 15 3d 67 83 7a 
      |  |  63 
      |  02 03          ;INTEGER (3 bytes)
      |     01 00 01
      

      给出公钥模数和指数:

      • 模数 = 0xfb1199ff0733f6e805a4fd3b36ca68...837a63
      • 指数 = 65,537

      更新:我的expanded form of this answer in another question

      【讨论】:

      • RSA PUBLIC KEY 遵循 ASN.1 格式(参见 PKCS 规范),与 OpenSSH 的格式无关。
      • 很好的答案 - 非常感谢。根据来源,“前导零因为高位但数字为正”使其成为 ssh-rsa 密钥格式。我能找到的最有用的提示是 github.com/openssh/openssh-portable 中的一条评论,上面写着“/* 如果设置了 MSB,则在以 ssh-rsa 格式写出 bignums 时添加一个 \0 */”。由于生成的 RSA 密钥的性质,这似乎只是 50% (?) 的公共模数 (?) 时间的问题,而不是公共指数的问题。
      • 很好的答案,关于 stringmpint - 它在 RFC 4251 第 5 节中描述,无需质疑 :)
      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多