C#read der编码私钥

时间:2011-04-07 09:23:13

标签: c# asn.1 der

如何从ASN1 DER格式私钥中获取字段?是否有一个库可以解码并单独获取字段?

我需要提取模数,指数和所有其他字段。

或者有没有办法将其转换为.net xml格式?

3 个答案:

答案 0 :(得分:3)

如果你想要的只是减少解析ASN.1所需的代码,你可以看一下ASN.1 Editor project的LCLib部分。

这是一个简单的ASN.1处理器库。

使用样本DER编码的测试字符串“test1@rsa.com”:

16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d

    using (var stm = new MemoryStream(new byte[] { 0x16, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x31, 0x40, 0x72, 0x73, 0x61, 0x2e, 0x63, 0x6f, 0x6d }))
    {
        Asn1Parser parser = new Asn1Parser();
        parser.LoadData(stm);
        var decoded = parser.ToString();
    }

提供格式化输出:

  

胶印| Len | LenByte |   ====== + ====== + ======= + ====

 0|    13|      1| IA5 STRING : 'test1@rsa.com'

您可以走树,并根据需要处理节点。

答案 1 :(得分:1)

通常的private key来自PEM DER ASN.1:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7dTxHvzZoEKZj
ZJiYM2xL0oarJyLWItVmBg6UMNJ/OKYZ83++kCQIwTM8MLB8FBBC+qzGO8755IRN
uXodpzXucXy1+83UkmRwYV97FvGxEUuZ/fkOad0Y6UiIQ1mSRWhh0teGcXdG8LKC
v8HsrSChjnA2oZvzGiqlT5OfNdyecltZy8FOyeHrStM+4MD9V20K2Gp7V7s8swTS
MFiv0iTvuPgk0VxoJC8H5yWQ/qQpFC2Mf//S33MoMpsDA6/jLi6SnMenEiIp9ZdW
rLt2R/fXHv7FAolhoQ8Y6uVNMv3smvMCL3js8vT4g4UJhPZq6dhFt6t5aYsxXYUS
Hp4FAcSfAgMBAAECggEAdrN+z0PCVNUuN0Ps6HuveLe/tMMcaRI3pNnzA12C/TJG
46nv2yB04OJN6jA+oOMnhPIs033tywkryffH3t0R5oIQYUAojxF/7jWKe2wE8YWt
JL7QpZLdgTe/SSG0p02yEjeraCOTTuV9dBOu3YqnXgXPApkFIkQQewtPxAIcSGu0
tsX5pAM3aojkSwgXzHAKN03CX5ubYkRMsMlx/10/gNB4x2OVdPAS5Cfvzf1vQIlq
EyWnrGnazQ6AVibb9ZHZjjcW+HB9C/xr0xXOXs3fok/vpRY9h6b4bHu2N/4735p1
A/TPdnst8F1hpIAmeLrnTKVQFiQYOMUyLavTI+WziQKBgQDxU2fqghM9VIlNEu5q
oCR7Vj8xh1su0HOBdvLyhNVwuGgoQ79BmyDmQqEruaUTxAFkorCJHAlO7yTLN6Z5
poHjPiGmeSuPeBKriUn5CfsWU0L5+1BRXw+Qvm2CUJO4TOOaZg60uxiuObwbSlVp
EBZ5pgD2CW2amabAuM/N2m9sXQKBgQDG20voWzCBYPfUTnPgpbVWMxvhUQZbZNEN
7qyDZaBercUCr7yE9otTjWKGhyEGePH5qX1gVVKYn3kahpF0dyeW+laQ2z3lWRbo
LZWuJ5pQwZ5Bt5qNJx2TIilTcXT1+Rm0RqqLYl3RV86WXdyLbkxe9B/FiQdIM/4J
JPcjBxPFKwKBgC4d7kHWUa7qtMJR19XwfIhFVxYz86zikPAwtwS5dcBwvRbUu3vi
FUtreDlO5Mj+L/X3UR0iinTXJoTfQaUFuNSgTvXtOfHU1FyLg+NfkOgXSTlUWWjz
bZoPigXZOCGEMAqVbkIDbxf8WIIullvZgzIEEzLxYkylCETUDIIeOCTRAoGBAIns
Kg7jyJXDusB/FXH3nPlHg4vYVc9n8nN2WiLchsmEPsOpPdj+4w21X2OtL6O8mSAv
hS0eoKYI3ccfFJ2x0zytLwNTfO+oxfGNRGbBQw/F6szr2n8SZTnalM0yQQwllMVr
yffY5vc+rqOuQDxY6RFmwu6QJwPWQ9j10Y9y5ix3AoGBAK/PItwpdbbj2G6BJedC
gB/Ka7H6kr7xjEbWvjXA9zTzSnS9CxsqVOyWdREijOGdgkkk3wFB4oRco8ZIlcr0
HjelRI6aHpoBdXIHriyxXbNSbXh8JMp8ljmBu5Kqr2xUjQsOTelX5x/VWvqmyI8M
TFkz6p1QYUPyqTxfZvudsrsO
-----END PRIVATE KEY-----

BEGIN PRIVATE KEY 标题告诉您这将是 PrivateKeyInfo 格式的数据。

PrivateKeyInfo ::= SEQUENCE {
    version                   Version,
    privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
    privateKey                PrivateKey,
    attributes           [0]  IMPLICIT Attributes OPTIONAL 
}

PrivateKeyAlgorithmIdentifier告诉您要遵循哪种私钥(例如EC,RSA,DH)。在RSA的情况下,算法ID是

  • 1.2.840.113549.1.1.1:rsaEncryption(PKCS#1)

这意味着它具有以下结构:

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

数据是base64编码的,我们可以解码:

30 82 04 be 02 01 00 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 04 82 04 a8 30 82 04 a4 02 01 00 02 82 01 01 00 bb 75 3c 47 bf 36 68 10 a6 63 64 98 98 33 6c 4b d2 86 ab 27 22 d6 22 d5 66 06 0e 94 30 d2 7f 38 a6 19 f3 7f be 90 24 08 c1 33 3c 30 b0 7c 14 10 42 fa ac c6 3b ce f9 e4 84 4d b9 7a 1d a7 35 ee 71 7c b5 fb cd d4 92 64 70 61 5f 7b 16 f1 b1 11 4b 99 fd f9 0e 69 dd 18 e9 48 88 43 59 92 45 68 61 d2 d7 86 71 77 46 f0 b2 82 bf c1 ec ad 20 a1 8e 70 36 a1 9b f3 1a 2a a5 4f 93 9f 35 dc 9e 72 5b 59 cb c1 4e c9 e1 eb 4a d3 3e e0 c0 fd 57 6d 0a d8 6a 7b 57 bb 3c b3 04 d2 30 58 af d2 24 ef b8 f8 24 d1 5c 68 24 2f 07 e7 25 90 fe a4 29 14 2d 8c 7f ff d2 df 73 28 32 9b 03 03 af e3 2e 2e 92 9c c7 a7 12 22 29 f5 97 56 ac bb 76 47 f7 d7 1e fe c5 02 89 61 a1 0f 18 ea e5 4d 32 fd ec 9a f3 02 2f 78 ec f2 f4 f8 83 85 09 84 f6 6a e9 d8 45 b7 ab 79 69 8b 31 5d 85 12 1e 9e 05 01 c4 9f 02 03 01 00 01 02 82 01 00 76 b3 7e cf 43 c2 54 d5 2e 37 43 ec e8 7b af 78 b7 bf b4 c3 1c 69 12 37 a4 d9 f3 03 5d 82 fd 32 46 e3 a9 ef db 20 74 e0 e2 4d ea 30 3e a0 e3 27 84 f2 2c d3 7d ed cb 09 2b c9 f7 c7 de dd 11 e6 82 10 61 40 28 8f 11 7f ee 35 8a 7b 6c 04 f1 85 ad 24 be d0 a5 92 dd 81 37 bf 49 21 b4 a7 4d b2 12 37 ab 68 23 93 4e e5 7d 74 13 ae dd 8a a7 5e 05 cf 02 99 05 22 44 10 7b 0b 4f c4 02 1c 48 6b b4 b6 c5 f9 a4 03 37 6a 88 e4 4b 08 17 cc 70 0a 37 4d c2 5f 9b 9b 62 44 4c b0 c9 71 ff 5d 3f 80 d0 78 c7 63 95 74 f0 12 e4 27 ef cd fd 6f 40 89 6a 13 25 a7 ac 69 da cd 0e 80 56 26 db f5 91 d9 8e 37 16 f8 70 7d 0b fc 6b d3 15 ce 5e cd df a2 4f ef a5 16 3d 87 a6 f8 6c 7b b6 37 fe 3b df 9a 75 03 f4 cf 76 7b 2d f0 5d 61 a4 80 26 78 ba e7 4c a5 50 16 24 18 38 c5 32 2d ab d3 23 e5 b3 89 02 81 81 00 f1 53 67 ea 82 13 3d 54 89 4d 12 ee 6a a0 24 7b 56 3f 31 87 5b 2e d0 73 81 76 f2 f2 84 d5 70 b8 68 28 43 bf 41 9b 20 e6 42 a1 2b b9 a5 13 c4 01 64 a2 b0 89 1c 09 4e ef 24 cb 37 a6 79 a6 81 e3 3e 21 a6 79 2b 8f 78 12 ab 89 49 f9 09 fb 16 53 42 f9 fb 50 51 5f 0f 90 be 6d 82 50 93 b8 4c e3 9a 66 0e b4 bb 18 ae 39 bc 1b 4a 55 69 10 16 79 a6 00 f6 09 6d 9a 99 a6 c0 b8 cf cd da 6f 6c 5d 02 81 81 00 c6 db 4b e8 5b 30 81 60 f7 d4 4e 73 e0 a5 b5 56 33 1b e1 51 06 5b 64 d1 0d ee ac 83 65 a0 5e ad c5 02 af bc 84 f6 8b 53 8d 62 86 87 21 06 78 f1 f9 a9 7d 60 55 52 98 9f 79 1a 86 91 74 77 27 96 fa 56 90 db 3d e5 59 16 e8 2d 95 ae 27 9a 50 c1 9e 41 b7 9a 8d 27 1d 93 22 29 53 71 74 f5 f9 19 b4 46 aa 8b 62 5d d1 57 ce 96 5d dc 8b 6e 4c 5e f4 1f c5 89 07 48 33 fe 09 24 f7 23 07 13 c5 2b 02 81 80 2e 1d ee 41 d6 51 ae ea b4 c2 51 d7 d5 f0 7c 88 45 57 16 33 f3 ac e2 90 f0 30 b7 04 b9 75 c0 70 bd 16 d4 bb 7b e2 15 4b 6b 78 39 4e e4 c8 fe 2f f5 f7 51 1d 22 8a 74 d7 26 84 df 41 a5 05 b8 d4 a0 4e f5 ed 39 f1 d4 d4 5c 8b 83 e3 5f 90 e8 17 49 39 54 59 68 f3 6d 9a 0f 8a 05 d9 38 21 84 30 0a 95 6e 42 03 6f 17 fc 58 82 2e 96 5b d9 83 32 04 13 32 f1 62 4c a5 08 44 d4 0c 82 1e 38 24 d1 02 81 81 00 89 ec 2a 0e e3 c8 95 c3 ba c0 7f 15 71 f7 9c f9 47 83 8b d8 55 cf 67 f2 73 76 5a 22 dc 86 c9 84 3e c3 a9 3d d8 fe e3 0d b5 5f 63 ad 2f a3 bc 99 20 2f 85 2d 1e a0 a6 08 dd c7 1f 14 9d b1 d3 3c ad 2f 03 53 7c ef a8 c5 f1 8d 44 66 c1 43 0f c5 ea cc eb da 7f 12 65 39 da 94 cd 32 41 0c 25 94 c5 6b c9 f7 d8 e6 f7 3e ae a3 ae 40 3c 58 e9 11 66 c2 ee 90 27 03 d6 43 d8 f5 d1 8f 72 e6 2c 77 02 81 81 00 af cf 22 dc 29 75 b6 e3 d8 6e 81 25 e7 42 80 1f ca 6b b1 fa 92 be f1 8c 46 d6 be 35 c0 f7 34 f3 4a 74 bd 0b 1b 2a 54 ec 96 75 11 22 8c e1 9d 82 49 24 df 01 41 e2 84 5c a3 c6 48 95 ca f4 1e 37 a5 44 8e 9a 1e 9a 01 75 72 07 ae 2c b1 5d b3 52 6d 78 7c 24 ca 7c 96 39 81 bb 92 aa af 6c 54 8d 0b 0e 4d e9 57 e7 1f d5 5a fa a6 c8 8f 0c 4c 59 33 ea 9d 50 61 43 f2 a9 3c 5f 66 fb 9d b2 bb 0e

知道它是DER ASN.1,我们可以开始解码:

  • SEQUENCE (0x4be字节):30 82 04 be
    • INTEGER (1个字节):02 01
      • Version:0 00
    • SEQUENCE (0x0d字节):30 0d
      • PrivateKeyAlgorithmIdentifier:1.2.840.113549.1.1.1 06 09 2a 86 48 86 f7 0d 01 01 01
      • null (0字节):05 00
    • OCTET STRING (0x04a8字节):04 82 04 a8
      • SEQUENCE (0x04a4字节)30 82 04 a4
        • INTEGER (1字节)02 01
          • Version:0 00
        • INTEGER (0x0101字节)02 82 01 01
          • modulus 00 bb 75 3c 47 bf 36 68 10 a6 63 64 98 98 33 6c 4b d2 86 ab 27 22 d6 22 d5 66 06 0e 94 30 d2 7f 38 a6 19 f3 7f be 90 24 08 c1 33 3c 30 b0 7c 14 10 42 fa ac c6 3b ce f9 e4 84 4d b9 7a 1d a7 35 ee 71 7c b5 fb cd d4 92 64 70 61 5f 7b 16 f1 b1 11 4b 99 fd f9 0e 69 dd 18 e9 48 88 43 59 92 45 68 61 d2 d7 86 71 77 46 f0 b2 82 bf c1 ec ad 20 a1 8e 70 36 a1 9b f3 1a 2a a5 4f 93 9f 35 dc 9e 72 5b 59 cb c1 4e c9 e1 eb 4a d3 3e e0 c0 fd 57 6d 0a d8 6a 7b 57 bb 3c b3 04 d2 30 58 af d2 24 ef b8 f8 24 d1 5c 68 24 2f 07 e7 25 90 fe a4 29 14 2d 8c 7f ff d2 df 73 28 32 9b 03 03 af e3 2e 2e 92 9c c7 a7 12 22 29 f5 97 56 ac bb 76 47 f7 d7 1e fe c5 02 89 61 a1 0f 18 ea e5 4d 32 fd ec 9a f3 02 2f 78 ec f2 f4 f8 83 85 09 84 f6 6a e9 d8 45 b7 ab 79 69 8b 31 5d 85 12 1e 9e 05 01 c4 9f
        • INTEGER (3个字节)02 03
          • publicExponent01 00 01
        • INTEGER (0x0100字节)02 82 01 00
          • privateExponent76 b3 7e cf 43 c2 54 d5 2e 37 43 ec e8 7b af 78 b7 bf b4 c3 1c 69 12 37 a4 d9 f3 03 5d 82 fd 32 46 e3 a9 ef db 20 74 e0 e2 4d ea 30 3e a0 e3 27 84 f2 2c d3 7d ed cb 09 2b c9 f7 c7 de dd 11 e6 82 10 61 40 28 8f 11 7f ee 35 8a 7b 6c 04 f1 85 ad 24 be d0 a5 92 dd 81 37 bf 49 21 b4 a7 4d b2 12 37 ab 68 23 93 4e e5 7d 74 13 ae dd 8a a7 5e 05 cf 02 99 05 22 44 10 7b 0b 4f c4 02 1c 48 6b b4 b6 c5 f9 a4 03 37 6a 88 e4 4b 08 17 cc 70 0a 37 4d c2 5f 9b 9b 62 44 4c b0 c9 71 ff 5d 3f 80 d0 78 c7 63 95 74 f0 12 e4 27 ef cd fd 6f 40 89 6a 13 25 a7 ac 69 da cd 0e 80 56 26 db f5 91 d9 8e 37 16 f8 70 7d 0b fc 6b d3 15 ce 5e cd df a2 4f ef a5 16 3d 87 a6 f8 6c 7b b6 37 fe 3b df 9a 75 03 f4 cf 76 7b 2d f0 5d 61 a4 80 26 78 ba e7 4c a5 50 16 24 18 38 c5 32 2d ab d3 23 e5 b3 89
        • INTEGER (0x81字节)02 81 81
          • prime100 f1 53 67 ea 82 13 3d 54 89 4d 12 ee 6a a0 24 7b 56 3f 31 87 5b 2e d0 73 81 76 f2 f2 84 d5 70 b8 68 28 43 bf 41 9b 20 e6 42 a1 2b b9 a5 13 c4 01 64 a2 b0 89 1c 09 4e ef 24 cb 37 a6 79 a6 81 e3 3e 21 a6 79 2b 8f 78 12 ab 89 49 f9 09 fb 16 53 42 f9 fb 50 51 5f 0f 90 be 6d 82 50 93 b8 4c e3 9a 66 0e b4 bb 18 ae 39 bc 1b 4a 55 69 10 16 79 a6 00 f6 09 6d 9a 99 a6 c0 b8 cf cd da 6f 6c 5d
        • INTEGER (0x81字节)02 81 81
          • prime200 c6 db 4b e8 5b 30 81 60 f7 d4 4e 73 e0 a5 b5 56 33 1b e1 51 06 5b 64 d1 0d ee ac 83 65 a0 5e ad c5 02 af bc 84 f6 8b 53 8d 62 86 87 21 06 78 f1 f9 a9 7d 60 55 52 98 9f 79 1a 86 91 74 77 27 96 fa 56 90 db 3d e5 59 16 e8 2d 95 ae 27 9a 50 c1 9e 41 b7 9a 8d 27 1d 93 22 29 53 71 74 f5 f9 19 b4 46 aa 8b 62 5d d1 57 ce 96 5d dc 8b 6e 4c 5e f4 1f c5 89 07 48 33 fe 09 24 f7 23 07 13 c5 2b
        • INTEGER (0x80字节)02 81 80
          • exponent12e 1d ee 41 d6 51 ae ea b4 c2 51 d7 d5 f0 7c 88 45 57 16 33 f3 ac e2 90 f0 30 b7 04 b9 75 c0 70 bd 16 d4 bb 7b e2 15 4b 6b 78 39 4e e4 c8 fe 2f f5 f7 51 1d 22 8a 74 d7 26 84 df 41 a5 05 b8 d4 a0 4e f5 ed 39 f1 d4 d4 5c 8b 83 e3 5f 90 e8 17 49 39 54 59 68 f3 6d 9a 0f 8a 05 d9 38 21 84 30 0a 95 6e 42 03 6f 17 fc 58 82 2e 96 5b d9 83 32 04 13 32 f1 62 4c a5 08 44 d4 0c 82 1e 38 24 d1
        • INTEGER (0x81字节)02 81 81
          • exponent200 89 ec 2a 0e e3 c8 95 c3 ba c0 7f 15 71 f7 9c f9 47 83 8b d8 55 cf 67 f2 73 76 5a 22 dc 86 c9 84 3e c3 a9 3d d8 fe e3 0d b5 5f 63 ad 2f a3 bc 99 20 2f 85 2d 1e a0 a6 08 dd c7 1f 14 9d b1 d3 3c ad 2f 03 53 7c ef a8 c5 f1 8d 44 66 c1 43 0f c5 ea cc eb da 7f 12 65 39 da 94 cd 32 41 0c 25 94 c5 6b c9 f7 d8 e6 f7 3e ae a3 ae 40 3c 58 e9 11 66 c2 ee 90 27 03 d6 43 d8 f5 d1 8f 72 e6 2c 77
        • INTEGER (0x81字节)02 81 81
          • coefficient00 af cf 22 dc 29 75 b6 e3 d8 6e 81 25 e7 42 80 1f ca 6b b1 fa 92 be f1 8c 46 d6 be 35 c0 f7 34 f3 4a 74 bd 0b 1b 2a 54 ec 96 75 11 22 8c e1 9d 82 49 24 df 01 41 e2 84 5c a3 c6 48 95 ca f4 1e 37 a5 44 8e 9a 1e 9a 01 75 72 07 ae 2c b1 5d b3 52 6d 78 7c 24 ca 7c 96 39 81 bb 92 aa af 6c 54 8d 0b 0e 4d e9 57 e7 1f d5 5a fa a6 c8 8f 0c 4c 59 33 ea 9d 50 61 43 f2 a9 3c 5f 66 fb 9d b2 bb 0e

因此,您拥有最终的RSA私钥值:

version:         0
modulus:         236643739934412948903373669476774126683629718702123314074863910669092…
publicExponent:  65,537
privateExponent: 149846324420376321261899444735289218048490924156116627413411926527864…
prime1:          169464742892393599674909179163866779357332259972872392530945213283668…
prime2:          139641872341951706778976733766729896659299032766950485174897609653257…
exponent1:       323844002622081792320149314104745036341490947693707957956201512300634… 
exponent2:       968524849673225022756364715102416566618618114106799869329534590657009… 
coefficient:     123457366510080958921249047966574081489759226696746456882235437625391… 

答案 2 :(得分:0)

我找到了答案,我使用了这个实用程序中的代码: http://www.jensign.com/opensslkey/

源代码:OpenSSLKey