【发布时间】:2018-07-17 08:33:21
【问题描述】:
使用 OpenSSL 1.1.0 是否有一种更简单的方法来减少 bignum,这样结果将是模数,适合 unsigned long
我想做的事情如下:
char p_str[] = "489133282872437279"; // A big prime
BIGNUM *p = BN_new();
BN_dec2bn(&p, p_str); // Prime converted into bignum
BIGNUM *a = BN_new();
BN_rand_range(a, p); // Find random number from 0 to prime
// Define max modulo for data type. Note the +1! wont work
BN_ULONG m = std::numeric_limits<unsigned long>::max() + 1;
// Reduce random number in field Z_p such that it fits into unsigned long
unsigned long result = BN_mod_word(a, m);
std::cout << result << std::endl;
另一种方法是定义另一个 BIGNUM
char m_str[] = "4294967296"; // Note that this is now 2**32, which we want
BIGNUM *m_2 = BN_new();
BN_dec2bn(&m_2, m_str);
然后计算如下:
BN_CTX *ctx = BN_CTX_new();
BIGNUM *remainder = BN_new();
BN_nnmod(remainder, a, m_2, ctx);
这需要现在将生成的 BN 余数转换回数据类型。
我想知道是否有任何更简单的方法可以进行此类缩减,以便将余数适合数据类型。
【问题讨论】:
-
你只是想获得低 32 位吗?
-
对不同的位大小进行概括会很棒。 8、16、32、64。