Проверить подпись ECDSA подпись с Openssl

Я хочу создать подпись и проверить ее с помощью openssl. Я хочу получить шестнадцатеричный вывод моей подписи.

это мой код

#create private key
openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -noout -out private.pem

#public key derivation
openssl ec -in private.pem -pubout -out public.pem

#create signature
openssl dgst -sha256 -hex -sign private.pem msg.txt  > signature.hex

#check signature
openssl dgst -sha256 -verify public.pem -signature signature.hex msg.txt

Я получаю такую ​​ошибку:

Error Verifying Data
4573216364:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1220:
4573216364:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:386:Type=ECDSA_SIG

Если я удалю -hex во время создания подписи, это сработает.

$ openssl version
OpenSSL 1.0.2s  28 May 2019

person monkeyUser    schedule 27.02.2020    source источник


Ответы (1)


Параметр "-hex" команды openssl dgst означает что вывод НЕ двоичный, а шестнадцатеричный дамп двоичного вывода.

Цитировать:

-hex

дайджест выводится как шестнадцатеричный дамп. Это вариант по умолчанию для «обычного» дайджеста, а не для цифровой подписи. См. ПРИМЕЧАНИЯ ниже для цифровых подписей с использованием -hex.

И раздел примечаний:

Шестнадцатеричные подписи не могут быть проверены с помощью openssl. Вместо этого используйте «xxd -r» или аналогичную программу для преобразования шестнадцатеричной подписи в двоичную подпись перед проверкой.

Поэтому, если вы используете параметр -hex для шестнадцатеричного дампа, вам нужно каким-то образом преобразовать его обратно в двоичный файл, прежде чем передавать его в openssl для проверки.

person Shane Powell    schedule 27.02.2020
comment
Я получаю ту же ошибку, что и OP, даже без флага -hex .. есть идеи? - person mikew; 19.06.2020
comment
Если вы получили эту ошибку, подпись по какой-то причине повреждена. Поэтому вам нужно будет посмотреть, что происходит с данными, поступающими из openssl в его хранилище (файл?), И что они никак не меняются. openssl ожидает, что файл подписи будет в двоичном формате на выходе исходной команды openssl. - person Shane Powell; 20.06.2020
comment
Я буквально просто выполняю команду openssl, которую опубликовал здесь OP, минус -hex ... я нашел этот другой вопрос, где, по-видимому, вам нужно шестнадцатеричное редактировать подпись, потому что openssl вывел ее неправильно ... похоже на хлопот: stackoverflow.com/questions/59904522/ - person mikew; 20.06.2020
comment
Если ваш openssl.exe по какой-то причине неплох, то это сводится к тому, что конвейер перенаправления приложения ОС / консоли в файл не повреждает двоичный вывод. Если ваше консольное приложение предполагает, что вывод - это текст, это может привести к повреждению вывода, записанного в файл в Windows (например). - person Shane Powell; 20.06.2020
comment
Попробуйте использовать опцию -out ‹filename› в openssl, чтобы убедиться, что ничего не связано с прямым доступом к файлу. - person Shane Powell; 20.06.2020
comment
Я видел параметр -out в другом руководстве, но я получал сообщение об ошибке, используя его, можно только подписать или проверить один файл ... Я попробовал снова только сейчас и переместил параметр -out ПЕРЕД параметром -sign, и теперь он работает ! большое спасибо - person mikew; 20.06.2020