Рейтинг:1

Детали структуры содержимого OpenSSL EC PRIVATE KEY

флаг cn

Задний план Я пытаюсь понять, как содержимое PEM отформатировано для «Закрытого ключа EC», например. следующий закрытый ключ

----- НАЧАЛО ПАРАМЕТРОВ EC-----
BgUrgQQAIw==
-----КОНЕЦ ПАРАМЕТРОВ EC-----
-----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ EC-----
MIHcAgeEBBEIAavpiUck1lQc01A6FH1SE1XSwW4C+i354tOQyPjioSnq5lzc9YQXX
YAIiC6hiMhARzBxe2vmYBECEENlmCG0jNymgBwYFK4EEACOhgYkDgYYABAEyMQ/2
NkU0LHTBhpsbeaFklNSXUeG2znLuFvcb0hvc29R5ydz8/dpDOhhEtT3+SRiYOMBS
f5wQRRWyf872XFtxhgGp6MFrfHL0c2ofvYIfxLJPXSnq+GCqOKi83GwKITfkkd9N
iwfW7YlKbAQPSoPcCoPG+cNCMLs3FLN/6fD6K99R/w==
-----КОНЕЦ ЗАКРЫТОГО КЛЮЧА EC-----

который был создан с помощью следующей команды openssl на случай, если кому-то захочется увидеть

openssl ecparam -out ecc_private_key.key -name secp521r1 -genkey

Недавно я понял, что содержимое между -----XXX EC ЧАСТНЫЙ КЛЮЧ----- содержит больше, чем просто закрытый ключ, и не может использоваться как параметр "D" в уравнении эллиптической кривой. Итак, используя следующую команду, я смог найти отдельные элементы, также указанные ниже;

$ openssl ec -in ecc_private_key.key -noout -text
прочитать ключ ЕС
Закрытый ключ: (521 бит)
приват:
    00:6a:fa:62:51:c9:35:95:07:34:d4:0e:85:1f:54:
    84:d5:74:b0:5b:80:be:8b:7e:78:b4:e4:32:3e:38:
    a8:4a:7a:b9:97:37:3d:61:05:d7:c8:02:22:0b:a8:
    62:32:10:11:cc:1c:5e:da:f9:98:05:e0:84:10:d9:
    66:08:6д:23:37:29
паб:
    04:01:32:31:0f:f6:36:45:34:2c:74:c1:86:9b:1b:
    79:a1:64:94:d4:97:51:e1:b6:ce:72:ee:16:f7:1b:
    d2:1b:dc:db:d4:79:c9:dc:fc:fd:da:43:3a:18:44:
    b5:3d:fe:49:18:98:3a:60:52:7f:9c:10:45:15:b2:
    7f:ce:f6:5c:5b:71:86:01:a9:e8:c1:6b:7c:72:f4:
    73:6a:1f:bd:82:1f:c4:b2:4f:5d:29:ea:f8:60:aa:
    38:a8:bc:dc:6c:0a:21:37:e4:91:df:4d:8b:07:d6:
    ed:89:4a:6c:04:0f:4a:83:dc:0a:83:c6:f9:c3:42:
    30:bb:37:14:b3:7f:e9:f0:fa:2b:df:51:ff
OID ASN1: secp521r1
КРИВАЯ NIST: P-521

Вопрос: Я хотел бы знать, как openssl может декодировать содержимое Base64 и извлекать из него закрытый и открытый ключи. В настоящее время я имею дело с приложением, в котором нет встроенных возможностей PemReader, поэтому я хотел бы написать свою собственную реализацию PemReader, чтобы я мог декодировать эту информацию в своем приложении (пока только ключи EC)

PS: я уже прошел RFC5915 в соответствии с этим закрытый ключ должен начинаться с 1 (версия), но все ключи, которые я генерирую с помощью openssl, всегда начинаются с 0x30. Так что я что-то упускаю, конечно

dave_thompson_085 avatar
флаг cn
5915 #3 говорит, что это ECPrivateKey типа ASN.1, который представляет собой ПОСЛЕДОВАТЕЛЬНОСТЬ, _содержащую_ ЦЕЛОЕ ЧИСЛО со значением 1 и т. д. Кодирование DER (или BER) ПОСЛЕДОВАТЕЛЬНОСТИ начинается с тега _for_ SEQUENCE, который равен 0x30.
Рейтинг:4
флаг jp

Данные закрытого ключа закодированы в АСН.1, поэтому вам нужно декодировать это, чтобы получить различные поля. asn1parse openssl может сделать это, но по умолчанию он будет анализировать раздел файла «EC PARAMETERS» (поскольку он предшествует разделу «EC PRIVATE KEY»), поэтому вам нужно сначала удалить его. Вы можете сделать это с сед, а затем передать результат в asn1parse openssl:

$ sed '1,/-----НАЧАЛО EC PRIVATE KEY-----/ d' ecc_private_key.key | openssl asn1parse --dump
    0:d=0 hl=3 l= 220 минус: ПОСЛЕДОВАТЕЛЬНОСТЬ          
    3:d=1 hl=2 l= 1 простое число: ЦЕЛОЕ ЧИСЛО :01
    6:d=1 hl=2 l= 66 prim: ОКТЕТНАЯ СТРОКА      
      0000 - 00 6a fa 62 51 c9 35 95-07 34 d4 0e 85 1f 54 84 .j.bQ.5..4....T.
      0010 - d5 74 b0 5b 80 be 8b 7e-78 b4 e4 32 3e 38 a8 4a .t.[...~x..2>8.J
      0020 - 7а b9 97 37 3d 61 05 d7-c8 02 22 0b a8 62 32 10 z..7=a..."..b2.
      0030 - 11 cc 1c 5e da f9 98 05-e0 84 10 d9 66 08 6d 23 ...^........f.m#
      0040 - 37 29 7)
   74:d=1 hl=2 l= 7 минус: продолжение [ 0 ]        
   76:d=2 hl=2 l= 5 prim: ОБЪЕКТ :secp521r1
   83:d=1 hl=3 l= 137 минус: продолжение [ 1 ]        
   86:d=2 hl=3 l= 134 prim: БИТОВАЯ СТРОКА        
      0000 - 00 04 01 32 31 0f f6 36-45 34 2c 74 c1 86 9b 1b ...21..6E4,t....
      0010 - 79 a1 64 94 d4 97 51 e1-b6 ce 72 ee 16 f7 1b d2 y.d...Q...r.....
      0020 - 1b dc db d4 79 c9 dc fc-fd da 43 3a 18 44 b5 3d ....y.....C:.D.=
      0030 - fe 49 18 98 3a 60 52 7f-9c 10 45 15 b2 7f ce f6 .I..:`R...E.....
      0040 - 5c 5b 71 86 01 a9 e8 c1-6b 7c 72 f4 73 6a 1f bd \[q.....k|r.sj..
      0050 - 82 1f c4 b2 4f 5d 29 ea-f8 60 aa 38 a8 bc dc 6c ....O])...`.8...l
      0060 - 0a 21 37 e4 91 df 4d 8b-07 d6 ed 89 4a 6c 04 0f .!7...M.....Jl..
      0070 - 4a 83 dc 0a 83 c6 f9 c3-42 30 бб 37 14 b3 7f e9 J.......B0.7....
      0080 - f0 fa 2b df 51 ff ..+.Q.

Кстати, теперь вы опубликовали этот закрытый ключ в Интернете... поэтому, пожалуйста, никогда не используйте его для чего-либо, что вы действительно хотите защитить.

Mubashar avatar
флаг cn
спасибо за ответ, я прохожу через это. Конечно, это всего лишь образец ключа, который не предназначен для использования в производстве.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.