我在使用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 ......:/
答案 0 :(得分:1)
您需要BN_mod_inverse
功能。其他功能不提供此类算法。
如果q是素数,你也可以对(q-2)模q执行求幂。由于费马的小定理,你将得到逆场成员。