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

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

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

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

Большое спасибо.


person mmm    schedule 07.03.2013    source источник


Ответы (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 () декодирует закодированную в DER подпись ECDSA и возвращает декодированную подпись во вновь выделенной структуре ECDSA_SIG. * sig указывает на буфер, содержащий закодированную в DER подпись размера len. "

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

person Marek    schedule 10.03.2013

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

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

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

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

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

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

person mmm    schedule 08.03.2013