Знак ECDSA, использующий OpenSSL без ASN1, кодирующий хеш

Я делаю ECDSA подписи, используя dgst Команда с OpenSSL выглядит следующим образом:

openssl dgst -sha256 -sign key.pem -out my_signature data_file

который работает просто отлично. Однако я прочитал в этом ответе SO, что сначала SHA256 хэширует data_file, а ASN.1 кодирует хэш перед его подписанием.

Я хотел бы создать хеш данных SHA256 и заставить ECDSA подписывать только необработанные байты этого хеша. (Так как это подпись ECDSA, я не могу использовать rsautl как в упомянутом SO ответе.)

Как мне добиться этого с помощью OpenSSL?

1 ответ

Решение

Вы можете сделать это с openssl pkeyutl которая является заменой openssl rsautl который поддерживает ECDSA.

Предположим, вы хотите хэшировать и подписать файл data.txt с помощью openssl. Сначала вам нужно хешировать файл:

openssl dgst -sha256 -binary -out data.sha256 data.txt

после того, как вы можете подписать его:

openssl pkeyutl -sign -inkey private.pem -in data.sha256 -out data.sig

Однако подпись все еще в формате ASN.1. Для получения r и s значений подписи используйте openssl asn1parse:

openssl asn1parse -inform DER -in data.sig
Другие вопросы по тегам