Получение Digital Signature с помощью Eliptic Curve алгоритма

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

  • Создание ключа:
openssl ecparam -name prime256v1 -genkey -noout -out key.pem
  • Получение сигнатуры сообщения из файла data в base64
cat data | openssl dgst -sha256 -sign key.pem -binary | openssl base64

В результате двух последовательных запусков получаю два разных ответа, к примеру:

MEUCIQC3eEBbeU83Fd/fdzfnUi1oe5We5NildCmVjUCkIpErPQIgeHVVoVHP4z6C
KhZPmAVIz/MX6vTgCCSd3t7QnZmHmMw=
MEYCIQC9zmlo2W/MN2CTx92rjviS3PpG6lW2ouTbARQCuL9gdwIhAJ+MoDmRiiHp
YqFVkkc9PM0v1e5VyMYdL9EIXKORqqh1

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


Ответы (1 шт):

Автор решения: Pak Uula

А вы проверьте правильность подписи ;)

Сначала сгенерируем открытый ключ:

openssl ec -in key.pem -pubout -out public.pem

Немного модифицируем вашу команду, добавим сохранение подписи в файл.

cat data | openssl dgst -sha256 -sign key.pem -binary | tee sign.bin | openssl base64

Подпись сохранена в файле sign.bin. Теперь проверим:

cat data | openssl dgst -verify public.pem -signature sign.bin

Результат: Verified OK

Несмотря на то, что подписи каждый раз получаются разными, они успешно верифицируются. Почему же подписи каждый раз получаются разными. Взгляните на описание алгоритма в википедии, шаги 3 и 4:

  1. Select a cryptographically secure random integer k from [1,n-1]
  1. Calculate the curve point (x1,y1) = k x G

В переводе на русский - возьмите произвольную точку в группе точек эллиптической кривой...

Точка каждый раз выбирается новая, отсюда и разнобой в подписи.

→ Ссылка