Предмет:
Другие предметыАвтор:
abigailОтвет:
#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Добавить свой ответ
Предмет:
МатематикаАвтор:
adalynОтветов:
Смотреть
Предмет:
Русский языкАвтор:
maggie-mooОтветов:
Смотреть
Предмет:
ЛитератураАвтор:
penelopereevesОтветов:
Смотреть