Я пытаюсь сгенерировать "сырые", незакодированные подписи ECDSA для использования с криптографическим чипом. Цель состоит в том, чтобы что-то подписать на главном компьютере, а затем отправить это на чип для проверки. Однако у меня возникла небольшая проблема. Насколько я понимаю, подпись ECDSA должна быть 64 байта (для secp256v1). И когда я использую чип для генерации подписи, он действительно имеет длину 64 байта. Однако, когда я использую openssl, длина подписи составляет 71 байт. Начало подписи похоже на какой-то префикс, но я не могу найти никаких данных о том, что это такое.
Вот как я все пытаюсь:
Сгенерируйте ключ:
openssl ecparam -genkey -name secp256r1 -noout -out privkeyv1.pem
Сгенерируйте «сообщение» для подписи:
echo -n "Hello World" > test.txt
Я пробовал два способа подписать сообщение. Оба приводят к одному и тому же неожиданному результату.
Первый способ - сгенерировать хеш тестового файла sha256, затем подписать его:
sha256sum test.txt | cut -f 1 -d " " > hash
Подпишите с помощью pkutil
openssl pkeyutl -sign -in hash -inkey privkeyv1.pem -out test_sig_meth1
Метод 2: подпишите с помощью openssl dgst
openssl dgst -sha256 -binary -sign privkeyv1.pem -out test_sig_meth2 test.txt
Проблема: вот результат xxd -p -c 256 test_sig_meth1
: 3045022000a86fb146d5f8f6c15b962640bc2d1d928f5e0f96a5924e4db2853ec8b66fb002210085431613d0a235db1adabc090cc1062a246a78941972e298423f4b3d081b48c8
И вывод xxd -p -c 256 test_sig_meth2
: 30450220693732cd53d9f2ba3deae213d74cdf69a00e7325a10ddc6a4445ff2b33f95e62022100b6d2561e3afba10f95247ed05f0c59620dc0913f0d798b4148e05c4116b6384e
Как видите, оба этих метода генерируют несколько байтов в начале, которые выглядят как байты заголовка (30450220
, может быть, длиннее), но я не уверен, для чего они нужны и как их удалить. Для справки, вот подпись того же метода, сгенерированная на криптографическом чипе. Если вы удалите заполнение нулевым байтом в конце, это будет 64 байта. 4677AD09F2AF49D7445ED5D6AC7253ADC863EC6D5DB6D3CFBF9C6D3E221D0A7BA2561942524F46B590AEE749D827FBF80A961E884E3A7D85EC75FE48ADBC0BD00000000000000000000000
Вопрос: как я могу использовать openssl для генерации 64-байтовой необработанной (незашифрованной, без заголовка) подписи ECDSA, которую я могу использовать с этой схемой?