【问题标题】:Math using OpenSSL BIGNUMs: How to calculate multiplicative inverse?使用 OpenSSL BIGNUMs 的数学:如何计算乘法逆?
【发布时间】:2012-10-23 01:46:18
【问题描述】:

我在使用 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...:/

【问题讨论】:

  • BN_exp() 适用于正指数。

标签: cryptography openssl bignum


【解决方案1】:

您需要一个BN_mod_inverse 函数。其他函数不提供这种算法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多