1

我在使用 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,[大素数],[完全相同的大素数]。

很明显 BN_exp 没有做我期望的事情。在这种情况下,我想我可以只使用 BN_div 来做 1/x,但我想知道我是否缺少更大的图片。我正在使用这样的大量计算,但我并不总是能够直观地验证该值是否像我预期的那样发生了变化。

任何人都可以帮忙吗?提前致谢!

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

4

1 回答 1

1

你需要一个BN_mod_inverse函数。其他函数不提供这样的算法。

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

于 2012-10-23T06:13:15.630 回答