C # читать дер кодированный закрытый ключ - PullRequest
4 голосов
/ 07 апреля 2011

Как я могу получить поля из закрытого ключа формата ASN1 DER?Есть ли библиотека для декодирования и получения полей по отдельности?

Мне нужно извлечь модуль, экспоненту и все остальные поля.

Или, может быть, есть способ конвертировать ее в .netXML-формат?

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Если все, что вам нужно, - это уменьшить код, необходимый для анализа ASN.1, вы можете взглянуть на часть LCLib проекта ASN.1 Editor .

Этопростая библиотека процессора ASN.1.

Использование примера кодированной DER тестовой строки "test1@rsa.com":

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

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

Дает форматированный вывод:

Смещение |Лен | ЛенБайт |====== + ====== + ======= + ====

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

Вы можете обходить дерево и обрабатывать узлы так, как выхочу.

1 голос
/ 22 сентября 2017

Обычный закрытый ключ , который у вас есть, называется 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 идентификатор алгоритма:

  • 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
    • ПОСЛЕДОВАТЕЛЬНОСТЬ (0x0d байт): 30 0d
      • PrivateKeyAlgorithmIdentifier: 1.2.840.113549.1.1.1 06 09 2a 86 48 86 f7 0d 01 01 01
      • ноль (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
          • publicExponent: 01 00 01
        • INTEGER (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
        • INTEGER (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
        • INTEGER (0x81 байт) 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 байт) 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 байт) 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 байт) 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… 
0 голосов
/ 11 апреля 2011

Я нашел ответ на него, я использовал код из этой утилиты: http://www.jensign.com/opensslkey/

И исходный код: OpenSSLKey

...