使用OpenSSL BIGNUMs的数学:如何计算乘法逆?

时间:2012-10-23 01:46:19

标签: cryptography openssl bignum

我在使用OpenSSL BIGNUM时遇到了一些问题。我正在尝试实现一个基本的ElGamal协议。我遇到的问题是,其中一些计算没有返回我期望的值!当我尝试计算乘法逆时,这是显而易见的。

例如:

static void roughExample() {
BIGNUM *u1 = BN_new();
BIGNUM *u2 = BN_new();

BIGNUM *one = BN_new();
BN_one(one);
BIGNUM *negOne = BN_new();
BN_zero(negOne);
BN_sub(negOne, negOne, one); // So negOne should = -1 and it does

BN_print_fp(stdout, negOne);  //shows -1 here

BN_rand_range(u1, q); // q = large prime, point being that u1 = random large num
BN_print_fp(stdout, u1);

BN_exp(u2, u1, negOne, ctx);
BN_print_fp(stdout, u2); // in the output, u1 = u2.
}

上面的输出结果为:-1,[large prime],[完全相同的大素数]。

很明显BN_exp没有做我期待的事情。在这种情况下,我想我可以使用BN_div做1 / x,但我想知道是否有更大的图片,我错过了。我正在使用这样的大量计算,我不会总是能够在视觉上验证值是否像我预期的那样发生了变化。

有人可以帮忙吗?提前谢谢!

编辑:我尝试使用1 / x,它产生的值为0 ......:/

1 个答案:

答案 0 :(得分:1)

您需要BN_mod_inverse功能。其他功能不提供此类算法。

如果q是素数,你也可以对(q-2)模q执行求幂。由于费马的小定理,你将得到逆场成员。