Получение 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 шт):
А вы проверьте правильность подписи ;)
Сначала сгенерируем открытый ключ:
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:
- Select a cryptographically secure random integer k from [1,n-1]
- Calculate the curve point (x1,y1) = k x G
В переводе на русский - возьмите произвольную точку в группе точек эллиптической кривой...
Точка каждый раз выбирается новая, отсюда и разнобой в подписи.