2013-03-07 4 views
0

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

Я использую код от: Signing a message using ECDSA in OpenSSL

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

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

ответ

1

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

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 и пишет закодированную подпись * С. (примечание: если рр NULL i2d_ECDSA_SIG возвращает ожидаемую длину в байтах DER закодированная подпись). i2d_ECDSA_SIG возвращает длину кодированной DER-сигнатуры (или 0 при ошибке).

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

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

0

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

После того как мы имеем подписи это сам:

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

Мы можем вывести значения г и S таким образом:

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

Благодарности С наилучшими пожеланиями