尽快使用OpenSSL的BIGNUM分割数字

时间:2016-01-21 17:54:18

标签: c openssl bignum

我正在使用OpenSSL的BIGNUM库来获取任意精度数字。

我需要将一个数字分成两部分。我需要一个数字中的前n位[0,n-1](我的意思是n个最低有效位),其余的位[n,end]在另一个数字中。

我所拥有的代码就是这个

// refer to the test definitions in the function testObject(browser)
it('sample test case', function(done) {
    return testObject(browser)
                .then(done);
});

我已经确定这个函数是我的应用程序执行时间的最大贡献者之一,所以让它快一点会对我有所帮助。

似乎可以改进的部分是void number_split(BIGNUM * first_n_bits, BIGNUM * the_rest, BIGNUM * number, long n) { int i = 0; BN_copy(first_n_bits, number); int bits = BN_num_bits(first_n_bits); while(bits > n) { BN_clear_bit(first_n_bits, --bits); } if(BN_num_bits(number) > n) { BN_rshift(the_rest, number, n); } else { BN_copy(the_rest, zero); } } 循环,我一次清除一个最重要的位。我本以为BIGNIM会有更高效地完成它的功能,但是我找不到它。

那么,我能做些什么来加快速度呢?

1 个答案:

答案 0 :(得分:1)

你可以使用BN_mask_bits()函数,它应该比循环每一位更快。

// BN_num_bits(num) must be >= n
void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) {
  BN_copy(low_bits, num);
  BN_mask_bits(low_bits, n);
  BN_rshift(high_bits, num, n);
}

如果BN_num_bits(num) < n可能会添加支票:

void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) {
  BN_copy(low_bits, num);
  if(BN_num_bits(num) <= n) {
    BN_copy(high_bits, zero);
  } else {
    BN_mask_bits(low_bits, n);
    BN_rshift(high_bits, num, n);
  }
}