C Openssl中的大数模小整数

C Openssl中的大数模小整数,c,openssl,C,Openssl,我想知道,在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的答案中给出了最好、最有效的方法,那就是打电话 一种效率较低的方法是先

我想知道,在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的答案中给出了最好、最有效的方法,那就是打电话

一种效率较低的方法是先将一个小整数A
BIGNUM
转换。这很麻烦,但并不难。我将向您展示通过使用
BN\u mod
计算
11 mod 3
来创建
BIGNUM
的两种方法。首先,为您的数字声明一个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() );
然后像平常一样使用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);
我想知道,在Openssl中,一个大数字是否可能模化一个小整数

。。。测试N是否是一个“Blum整数”(N mod 4==3),但是我不知道怎么做,因为函数BN_mod只支持大数字

是的,但它必须是一个无符号整数,这似乎与mod 4等价类有关。使用
BN_ULONG BN_mod_单词(const BIGNUM*a,BN_ULONG w)

在使用Diffie-Hellman参数之前,我使用它来验证这些参数。例如,请参见上的

该函数的手册页位于。

为什么不测试是否设置了(最低有效)位0和1?e、 g.
(p->d[0]&0x3==0x3)
,或者
BN是位集(p,0)和&BN是位集(p,1)
-我这里遗漏了什么吗?
BN_free(N);
BN_free(M);