【问题标题】:C# read der encoded private keyC# 读取 der 编码的私钥
【发布时间】:2011-07-31 12:46:45
【问题描述】:

如何从 ASN1 DER 格式的私钥中获取字段?是否有一个库可以分别解码和获取字段?

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

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

【问题讨论】:

  • 看看BouncyCastle 库。我在以前的项目中使用过它来处理类似的事情。

标签: c# asn.1 der


【解决方案1】:

如果您只想减少解析 ASN.1 所需的代码,您可以查看ASN.1 Editor project 的 LCLib 部分。

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

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

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();
    }

给出格式化输出:

偏移|伦 |LenByte| ======+======+========+====

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

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

【讨论】:

    【解决方案2】:

    您通常使用的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,我们就可以开始解码了:

    • 序列(0x4be 字节):30 82 04 be
      • 整数(1 字节):02 01
        • Version: 0 00
      • 序列(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
      • 八进制字符串(0x04a8 字节):04 82 04 a8
        • 序列(0x04a4 字节)30 82 04 a4
          • 整数(1 字节)02 01
            • Version: 0 00
          • 整数(0x0101 字节)02 82 01 01
            • modulus00 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
          • 整数(3 个字节)02 03
            • publicExponent: 01 00 01
          • 整数(0x0100 字节)02 82 01 00
            • privateExponent: 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
          • 整数(0x81 字节)02 81 81
            • prime1: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
          • 整数(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
          • 整数(0x80 字节)02 81 80
            • exponent1: 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
          • 整数(0x81 字节)02 81 81
            • exponent2: 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
          • 整数(0x81 字节)02 81 81
            • coefficient: 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

    这样你就有了最终的 RSA 私钥值:

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

    【讨论】:

      【解决方案3】:

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

      以及源代码:OpenSSLKey

      【讨论】:

        猜你喜欢
        • 2013-12-14
        • 2012-01-17
        • 2018-09-30
        • 2010-11-19
        • 2012-06-13
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多