Не могу подписать с DSA

384
Sean Walsh

Ключ DSA создается с помощью:

openssl genpkey -genparam -algorithm DSA -out dsaparams.pem -pkeyopt dsa_paramgen_bits:1024  openssl genpkey -paramfile dsaparams.pem -out dsakey.pem 

Когда я пытаюсь подписать, эта ошибка отображается:

echo 'bacon' > text  openssl pkeyutl -sign -in text -inkey dsakey.pem -out sig Public Key operation error 

Можно подписать, openssl dgst -signно не с помощью команд выше.

Почему это происходит? man openssl-pkeyutlГоворит DSA позволяет подпись и verifcation. Я использую OpenSSL 1.1.0g

0
https://serverfault.com/questions/219818/creating-a-dsa-signature-from-the-linux-command-line 6 лет назад 1

1 ответ на вопрос

1
fgrieu

TLDR: кажется openssl pkeyutl, предназначен для подписи хеша, но передается меньший файл, где ожидается хеш; и некоторая проверка, присутствующая в OpenSSL 1.1.0g (но не OpenSSL 1.0.2g), фиксирует эту ошибку.


FWIW, не было никакой ошибки, когда я попробовал команды вопроса с OpenSSL 1.0.2g. Но я вижу 3 причины, по которым он может потерпеть неудачу (и, во-первых, должен):

  1. openssl pkeyutlзадокументировано, что не выполняет хеш, который, как ожидается, будет выполнен внешне. Таким образом, я предполагаю, что более новые версии openssl pkeyutl bark прекрасно работают, когда входной файл короче, чем параметр q закрытого ключа, потому что это единственное, что нужно сделать. Это по крайней мере согласуется с man-страницей :

    В случае подписей RSA, ECDSA и DSA эта утилита не будет выполнять хеширование входных данных, а будет использовать данные непосредственно в качестве входных данных алгоритма подписи. В зависимости от типа ключа, типа подписи и режима заполнения максимальные допустимые длины входных данных различаются. В общем случае с RSA подписанные данные не могут быть длиннее, чем модуль ключа, в случае ECDSA и DSA данные не должны быть длиннее размера поля, в противном случае они будут незаметно усечены до размера поля.

    Другими словами, если значение дайджеста равно sha1, входное значение должно быть длиной 20 байтов для двоичного кодирования вывода хеш-функции SHA-1.

  2. В наши дни 1024-битный DSA по праву считается устаревшим, а в некоторых местах (включая некоторые реализации SSH) его поддержка была удалена.

  3. В наши дни SHA-1 по праву считается устаревшей.

Я бы предложил по крайней мере 2048-битный DSA, SHA-256 и хэширование файла перед вычислением сигнатуры, что лучше всего делать, openssl dgstкогда можно хэш-то-подписать, а когда openssl pkeyutlнет. Я не гуру openssl, но я бы попробовал исследовать следующее:

# generate a private key and extract the public key openssl genpkey -paramfile dsaparams.pem -out dsaprivkey.pem openssl dsa -in dsaprivkey.pem -pubout > dsapubkey.pem  # create a file "myfile" to be signed echo 'The Magic Words are Squeamish Ossifrage' > myfile  # create signature "myfile.sig" openssl dgst -sha256 -sign dsaprivkey.pem myfile > myfile.sig  # verify "myfile" against signature "myfile.sig" and public key openssl dgst -sha256 -verify dsapubkey.pem -signature myfile.sig myfile 

Примечание. В предыдущей попытке openssl 1.0.2g генерировал подписи с 160-битным q (возможно, с использованием SHA-1). За комментарий, я добавил -sha256к openssl dgst, но это не имело никакого значения. Эксперименты показывают, что это необходимо использовать -pkeyopt dsa_paramgen_q_bits:256, хотя man-страница явно заявляет -pkeyopt dsa_paramgen_md:sha256об этом:

dsa_paramgen_md:digest
Дайджест для использования при генерации параметров. Должен быть один из sha1, sha224или sha256. Если установлено, то число битов в q будет соответствовать выходному размеру указанного дайджеста, а dsa_paramgen_q_bitsпараметр будет игнорироваться (..)

Даже с `3072`, он не подписывает текст или даже хеш в` sha256` 6 лет назад 0
Благодарю. Использование `openssl dgst -sign` работает с RSA и DSA, но я все еще сомневаюсь, почему команда` openssl pkeyutl` не подпишется. 6 лет назад 0