大数字模数Openssl中的一个小整数

时间:2010-10-28 01:06:45

标签: 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仅支持大号。

2 个答案:

答案 0 :(得分:4)

是的,这是可能的。

在jww的答案中给出了最好和最有效的方法,即致电BN_mod_word()

效率较低的方法是先将BIGNUM转换为小整数。这很麻烦,但并不困难。我将通过使用BIGNUM计算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 :(得分:1)

  

我想知道Openssl中是否有可能是一个大数模的小整数?

     

...测试N是否是“Blum整数”(N mod 4 == 3),但我无法弄清楚如何执行此操作,因为函数BN_mod仅支持大数字。

是的,但它需要是一个无符号整数,你似乎与mod 4等价类有关。使用BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w)

我在使用之前用它来验证Diffie-Hellman参数。例如,请参阅Diffie-Hellman Parameter Check (when g = 2, must p mod 24 == 11?)上的Crypto Stack Exchange

该功能的手册页位于BN_mod_word(3)