我想知道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
仅支持大号。
答案 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)
。