2

Я использую эту команду, чтобы подписать файл:

openssl dgst -binary -sha1 -out signedFile.bin -sign file.pem plainText  

Я хочу знать, в каком формате выводится эта команда. Моя цель - проанализировать результат и извлечь массив хешей.

Какой формат? Есть ли инструменты для разбора результата?

1 ответ1

1

Если file.pem содержит закрытый ключ RSA (в этом случае это имя вводит в заблуждение), выводом является "голая" подпись RSA PKCS # 1 (v1.5) - N-разрядное число, где N - размер модуля, округленный в большую сторону если это необходимо, это редко происходит потому, что люди обычно используют размеры ключей, такие как 1024 и 2048, без каких-либо метаданных, обычно используемых с подписью. dgst -sign умолчанию имеет значение -binary что является избыточным (форма dgst только для хеш- функции не имеет значения), но, как говорит @ zedman9991, вы можете запросить -hex .

Но нет смысла разбирать это. Это число. Если вы хотите "восстановить" подписанное хеш-значение, которое поддерживает PKCS # 1, но другие форматы RSA могут этого не делать, а другие алгоритмы, такие как DSA и ECDSA, определенно этого не делают, вам необходимо (1) выполнить вычисления modexp-e (часто неточно называемые "дешифрование с помощью открытого ключа"), затем (2) распаковка, затем (3) декодирование ASN.1. "parse" может быть разумно использовано для обозначения (2) или (3) или обоих. Вы можете написать программу на C для этого, возможно, в 20 строк. С учетом двоичного файла rsautl -verify делает (1) и (2) (учитывая заполнение v1.5, которое является значением по умолчанию для dgst -sign ), и вы можете сделать (3) вручную или с помощью asn1parse:

c:\work>echo test >in & od -tx1 in
0000000 74 65 73 74 20 20 0d 0a
0000010

c:\work>openssl dgst -sha1 -hex in
SHA1(in)= a02bfe060e0d7857137b7082124541237ed740c7

c:\work>openssl dgst -sha1 -sign rsakey.pem in >sig & od -tx1 sig
0000000 53 e3 68 70 69 d9 fd 1f b1 83 6e eb 1c 6f 58 ab
0000020 b5 44 88 3f d2 67 19 21 9b 95 39 bb ce 2d 7c ac
0000040 51 03 c3 a5 61 7e 47 f6 4b e1 c0 4a 74 ee 7f 29
0000060 b2 cc ff 91 20 97 c4 f9 2e 3e 9f 61 06 62 e3 fe
0000100 ea 4c 3f a6 3b da b4 03 62 81 a7 8c 91 b7 d5 49
0000120 8c d1 e9 92 ff 4b 97 c0 b5 74 59 4d 19 e1 57 c9
0000140 a8 98 f4 c8 df 70 b4 89 57 b0 24 f5 b0 a9 69 b4
0000160 dd ed a0 26 73 bd ca ad a0 f9 e2 0e ea fe 39 8d

c:\work>openssl rsautl -verify -inkey rsakey.pem <sig >rec & od -tx1 rec
Loading 'screen' into random state - done
0000000 30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 a0
0000020 2b fe 06 0e 0d 78 57 13 7b 70 82 12 45 41 23 7e
0000040 d7 40 c7
0000043

c:\work>openssl asn1parse -inform der <rec
    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons: SEQUENCE
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:A02BFE060E0D7857137B7082124541237ED740C7

Значение последнего поля (OCTET STRING) "восстановленной" сигнатуры DER, которая в этом случае также является последними 20 октетами, является значением хеш-функции.

(Для простого примера я использовал 1024-битный ключ RSA и, следовательно, 128-байтовую подпись. RSA-1024 в настоящее время считается подверженным риску поломки в обозримом будущем, поэтому для защищенных приложений обычно требуется не менее 1536 и, как правило, 2048 или более.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .