Собственный случайный (не закрытый ключ) в ECDSA - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь отладить собственную реализацию подписи ECDSA. Чтобы сравнить промежуточные результаты, я бы хотел заставить OpenSSL, Crypto ++ или любой другой пакет использовать известное «случайное» число вместо генерации его каждый раз при создании подписи. Есть ли способ сделать это?

Поскольку я работаю с кривыми мозгового пула, я не могу использовать крипто API Microsoft. Это не поддерживает кривые мозгового пула в Crypto API до Windows 10.

Другим способом может быть получение случайного числа, использованного после создания подписи ECDSA, из одного из популярных пакетов.

Я ценю любую помощь

1 Ответ

0 голосов
/ 08 мая 2018

Да, это возможно с OpenSSL. OpenSSL предоставляет возможность переопределить источник случайных чисел по умолчанию. Для этого используйте функцию RAND_set_rand_method(), описанную здесь:

https://www.openssl.org/docs/man1.1.0/crypto/RAND_set_rand_method.html

Эта функция принимает в качестве аргумента структуру RAND_METHOD, которая содержит указатели на функции для реализации случайных возможностей OpenSSL. Замените элемент bytes собственной реализацией.

Например

RAND_METHOD myrand, *oldrand;

oldrand = RAND_get_rand_method();
myrand = *oldrand;
myrand.bytes = mybytes;
RAND_set_rand_method(myrand);

Где mybytes определяется так:

static int mybytes(unsigned char *buf, int num)
{
    /* Replace with however you want the random function to work */
    memset(buf, 0, num);
    return 1;
}

Собственный экдестат-код OpenSSL делает именно это. Например, см .:

https://github.com/openssl/openssl/blob/OpenSSL_1_1_0-stable/test/ecdsatest.c#L65

...