• Здравствуйте пожалуйста создайте ЭЦП на основе алгоритма ECDSA с использованием библиотеки OpenSSL.

Ответы 1

  • Ответ:

    #include <openssl/ec.h>

    #include <openssl/ecdsa.h>

    #include <openssl/obj_mac.h>

    #include <openssl/sha.h>

    #include <stdio.h>

    #include <stdlib.h>

    // Функция для вывода байтов в шестнадцатеричном формате

    void print_hex(const unsigned char *data, int len) {

     for (int i = 0; i < len; i++) {

       printf("%02x", data[i]);

     }

     printf("\n");

    }

    int main() {

     // Создаем контекст для работы с эллиптическими кривыми

     EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp256k1);

     if (group == NULL) {

       fprintf(stderr, "Ошибка при создании группы\n");

       return 1;

     }

     // Создаем ключевую пару для алгоритма ECDSA

     EC_KEY *key = EC_KEY_new();

     if (key == NULL) {

       fprintf(stderr, "Ошибка при создании ключа\n");

       return 1;

     }

     if (EC_KEY_set_group(key, group) != 1) {

       fprintf(stderr, "Ошибка при установке группы для ключа\n");

       return 1;

     }

     if (EC_KEY_generate_key(key) != 1) {

       fprintf(stderr, "Ошибка при генерации ключа\n");

       return 1;

     }

     // Выводим открытый и закрытый ключи в шестнадцатеричном формате

     const BIGNUM *priv = EC_KEY_get0_private_key(key);

     const EC_POINT *pub = EC_KEY_get0_public_key(key);

     printf("Закрытый ключ:\n");

     print_hex(BN_bn2hex(priv), BN_num_bytes(priv));

     printf("Открытый ключ:\n");

     print_hex(EC_POINT_point2hex(group, pub, POINT_CONVERSION_UNCOMPRESSED, NULL),

               EC_POINT_point2oct(group, pub, POINT_CONVERSION_UNCOMPRESSED, NULL,

                                  0, NULL));

     // Создаем сообщение, которое хотим подписать

     const char *msg = "Привет, мир!";

     printf("Сообщение:\n%s\n", msg);

     // Вычисляем хэш сообщения с помощью алгоритма SHA-256

     unsigned char hash[SHA256_DIGEST_LENGTH];

     SHA256((const unsigned char *)msg, strlen(msg), hash);

     printf("Хэш сообщения:\n");

     print_hex(hash, SHA256_DIGEST_LENGTH);

     // Создаем ЭЦП на основе хэша сообщения и закрытого ключа

     ECDSA_SIG *sig = ECDSA_do_sign(hash, SHA256_DIGEST_LENGTH, key);

     if (sig == NULL) {

       fprintf(stderr, "Ошибка при создании ЭЦП\n");

       return 1;

     }

     // Выводим ЭЦП в шестнадцатеричном формате

     const BIGNUM *r = ECDSA_SIG_get0_r(sig);

     const BIGNUM *s = ECDSA_SIG_get0_s(sig);

     printf("ЭЦП:\n");

     print_hex(BN_bn2hex(r), BN_num_bytes(r));

     print_hex(BN_bn2hex(s), BN_num_bytes(s));

     // Проверяем ЭЦП на основе хэша сообщения и открытого ключа

     int result = ECDSA_do_verify(hash, SHA256_DIGEST_LENGTH, sig, key);

     if (result == 1) {

       printf("ЭЦП верна\n");

     } else if (result == 0) {

       printf("ЭЦП неверна\n");

     } else {

       printf("Ошибка при проверке ЭЦП\n");

     }

     // Освобождаем память

     ECDSA_SIG_free(sig);

     EC_KEY_free(key);

     EC_GROUP_free(group);

     return 0;

    }

    Объяснение:

    • Автор:

      lidiauohb
    • 1 год назад
    • 6
  • Добавить свой ответ

Еще вопросы

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years