C # read der encoded private key

How can I get fields from a private key of the ASN1 DER format? Is there a library for decoding and getting fields separately?

I need to extract the module, exponent and all other fields.

Or maybe there is a way to convert it to .net xml format?

+4
source share
3 answers

I found the answer to this, I used the code from this utility: http://www.jensign.com/opensslkey/

And source code: OpenSSLKey

0
source

If you want to reduce the code needed to parse ASN.1, you could take a look at the LCLib part of the ASN.1 Editor project.

This is a simple ASN.1 processor library.

Using the sample test string programmed by 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(); } 

Gives a formatted result:

Offset | Len | LenByte | ====== + ====== + ======== + ====

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

You can walk on a tree and process nodes as you wish.

+3
source

You use the usual private key as PEM DER ASN.1 as:

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

This is the BEGIN PRIVATE KEY header, which tells you that it will be in PrivateKeyInfo format.

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

PrivateKeyAlgorithmIdentifier tells you which secret key should follow (e.g. EC, RSA, DH). In case of RSA algorithm identifier

  • 1.2.840.113549.1.1.1 : rsaEncryption (PKCS # 1)

This means that it has the following structure:

  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 } 

The data is encoded by base64, which we can decode:

 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 

Knowing that this is DER ASN.1, we can begin to decode:

  • SEQUENCE (0x4 bytes): 30 82 04 be
    • INTEGER (1 byte): 02 01
      • Version : 0 00
    • SEQUENCE (0x0d bytes): 30 0d
      • PrivateKeyAlgorithmIdentifier : 1.2.840.113549.1.1.1 06 09 2a 86 48 86 f7 0d 01 01 01
      • null (0 bytes): 05 00
    • OCTOBER STRING (0x04a8 bytes): 04 82 04 a8
      • SEQUENCE (0x04a4 bytes) 30 82 04 a4
        • INTEGER (1 byte) 02 01
          • Version : 0 00
        • INTEGER (0x0101 bytes) 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 bytes) 02 03
          • publicExponent : 01 00 01
        • INTEGER (0x0100 bytes) 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
        • INTEGER (0x81 bytes) 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
        • INTEGER (0x81 bytes) 02 81 81
          • prime2 : 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
        • INTEGER (0x80 bytes) 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
        • INTEGER (0x81 bytes) 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
        • INTEGER (0x81 bytes) 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

And you have your final RSA Private Key values:

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

Source: https://habr.com/ru/post/1347061/


All Articles