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

Cryptography 使用OpenSSL BIGNUMs的数学:如何计算乘法逆?,cryptography,openssl,bignum,Cryptography,Openssl,Bignum,我对OpenSSL BIGNUMs有一些问题。我正在尝试实现一个基本的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

我对OpenSSL BIGNUMs有一些问题。我正在尝试实现一个基本的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,[大素数],[完全相同的大素数]

很明显,BNU exp并没有达到我的预期。在这种情况下,我想我可以使用BN_div来做1/x,但我想知道是否有一个更大的图片我错过了。我正在用它做很多这样的计算,我不可能总是能够直观地验证值是否像我预期的那样发生了变化

有人能帮忙吗?提前谢谢


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

您需要一个
BN\u mod\u inverse
函数。其他函数不提供这种算法


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

你需要一个
BN\u mod\u逆
函数。其他函数不提供这种算法

如果q是素数,还可以对(q-2)模q执行幂运算。根据费马的小定理,你将得到反场成员。

BN_exp()适用于正指数。BN_exp()适用于正指数。