C реализация ECDSA подписи и проверки с помощью openssl

Я пытаюсь создать программу на C, где я могу выбрать из меню, какие параметры я хочу, из "Подписание сообщения" и "Проверка сообщения". У меня есть код, который подписывает сообщение и проверяет в то же время. Я хотел бы иметь возможность проанализировать сообщение и подписать его, например, для вывода сертификата. Затем, когда я выберу проверить, я вставлю то же самое сообщение и сертификат, чтобы я мог на самом деле проверить или нет сообщение.

Я использую код из: Подписание сообщения с помощью ECDSA в OpenSSL

PS: В основном я не знаю, как на самом деле напечатать подпись, закрытый и открытый ключи.

Огромное спасибо.

2 ответа

Решение

Используйте эти функции:

int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp);

ECDSA_SIG* d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len);

Согласно документации OpenSSL:

"i2d_ECDSA_SIG () создает кодировку DER сигнатуры ECDSA и записывает закодированную подпись в *pp (примечание: если pp равен NULL, i2d_ECDSA_SIG возвращает ожидаемую длину в байтах кодированной подписи DER). i2d_ECDSA_SIG возвращает длину закодированной DER подпись (или 0 при ошибке).

d2i_ECDSA_SIG () декодирует подпись ECDSA, кодированную DER, и возвращает декодированную подпись во вновь распределенной структуре ECDSA_SIG. *sig указывает на буфер, содержащий кодированную DER подпись размера len. "

Если вы хотите распечатать подпись на экране, то вам придется Base64 это:)

Я думаю, что я нашел способ напечатать значения r и s. Пара ключей из подписи (р, с)

После того, как у нас есть подпись, это само:

ECDSA_SIG *signature = ECDSA_do_sign(hash, strlen(hash), eckey);

Мы можем напечатать значения r и s следующим образом:

printf("(sig->r, sig->s): (%s,%s)\n", BN_bn2hex(signature->r), BN_bn2hex(signature->s));

Спасибо С наилучшими пожеланиями

Другие вопросы по тегам