Да, это возможно.
Лучший и эффективный способ дан в ответе 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);