Большое число по модулю маленькое целое число в Openssl - PullRequest
3 голосов
/ 28 октября 2010

Мне было интересно, возможно ли, чтобы большое число по модулю маленькое целое число в Openssl?

Скажем, я генерирую два больших простых числа:

BN_generate_prime(p,512,0,0,0,0,0);
BN_generate_prime(q,512,0,0,0,0,0);

и рассчитать произведение N:

BN_mul(N,p,q,ctx);

Я хотел бы проверить, является ли N "Blum integer" (N mod 4 == 3), однако я не могу понять, как это сделать, поскольку функция BN_mod поддерживает только большие числа.

Ответы [ 2 ]

4 голосов
/ 05 ноября 2010

Да, это возможно.

Лучший и эффективный способ дан в ответе jww, который заключается в вызове BN_mod_word () .

Менее эффективным способом являетсясделайте это, преобразовав сначала маленькое целое число BIGNUM.Это громоздко, но не сложно.Я покажу вам два способа создания BIGNUM s путем вычисления 11 mod 3 с BN_mod.Сначала объявите BIGNUM для своих чисел.

BIGNUM *N = BN_new();
BIGNUM *M = BN_new();

Метод 1 : преобразование вашего числа в строку, а затем в строку в BIGNUM.

#include <sstream>
int n = 11;
std::ostringstream num_str;
num_str << n;
BN_dec2bn( &N, num_str.str().c_str() );

(В C вы можете сделать char buf[12]; sprintf(buf, "%d", n); BN_dec2bn(&N, buf);)

Метод 2 : укажите ваш номер в виде массива байтов, но помните, что OpenSSL хочет, чтобы ваши байты были в формате с прямым порядком байтов, и всегда будетинтерпретировать ваши байты как положительное число.

#include <arpa/inet.h>   // For htonl to make the integer big endian
int m = 3;
m = htonl(m);
BN_bin2bn( (unsigned char *) &m, sizeof(m), M);

А затем просто использовать вашу функцию OpenSSL как обычно.

BN_mod(rem, N, M, ctx);
BN_print_fp(stdout, rem);  // (Using N=11 and M=3 above, this line prints 2)

И освободить ваши BIGNUM с.

BN_free(N);
BN_free(M);
1 голос
/ 06 мая 2015

Мне было интересно, возможно ли, чтобы большое число по модулю маленького целого в Openssl?

... проверить, является ли N "целым числом Блюма" (N mod 4 == 3)Тем не менее, я не могу понять, как это сделать, поскольку функция BN_mod поддерживает только большие числа.

Да, но это должно быть целое число без знака, которое вы, похоже, имеете с эквивалентностью в моде 4учебный класс.Используйте BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w).

Я использую его для проверки параметров Диффи-Хеллмана перед их использованием.См., Например, Проверка параметров Диффи-Хеллмана (когда g = 2, должен p mod 24 == 11?) на обмене Crypto Stack .

Справочные страницы для этой функции расположены по адресу BN_mod_word(3).

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