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));
Спасибо С наилучшими пожеланиями