我想知道是否有可能在 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 整数”(N mod 4==3),但是我不知道如何做到这一点,因为函数 BN_mod
只支持大数字。
最佳答案
是的,这是可能的。
jww的回答中给出了最好和有效的方法,即调用BN_mod_word() .
一种效率较低的方法是通过将小整数转换为 BIGNUM
第一的。这很麻烦,但并不困难。我将向您展示创建 BIGNUM
的两种方法。通过计算 11 mod 3
与 BN_mod
.首先,为您的号码声明一个 BIGNUM。
BIGNUM *N = BN_new();
BIGNUM *M = BN_new();
方法一 :将您的数字转换为字符串,然后将字符串转换为 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);
)方法二 :将您的数字作为字节数组提供,但请注意 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
s。BN_free(N);
BN_free(M);
关于c - Openssl中的大数模一个小整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038938/