寻找Ruby的divm或gmpy等价物

时间:2014-02-25 01:46:18

标签: python ruby cryptography openssl gmpy

在Python的gmpy2扩展模块中,有一个名为mpz的多精度整数类型。它包含一个powmod(x, y, m)函数,我在Ruby中一直缺少这个函数。我最近意识到Ruby实际上有一个powmod。它隐藏在OpenSSL模块中。

require 'openssl'
result = a_big_int.to_bn.mod_exp(exponent, modulo)

另一个功能,也是在gmpy2中,我一直缺少的是divm(...)

  

divm(a,b,m)返回x,使得b * x == a modulo m。如果不存在这样的值x,则引发ZeroDivisionError异常。

你知道OpenSSL模块是否还有另外一个惊喜或任何具有这种功能的宝石吗?如果它是一个快速的将是非常有帮助的。

2 个答案:

答案 0 :(得分:1)

快速浏览GMP中divm(a, b, m)的代码,表明它基本上是这样做的

  

b -1 * a%m

其中b -1 是模乘法逆。当反转调用失败时有一些回退逻辑(当发生这种情况时我不清楚),但是对于大多数目的,你可以在Ruby中这样做(使用与divm方法签名相同的变量名称):

b.to_bn.mod_inverse(m).mod_mul(a, m).to_i

答案 1 :(得分:0)

我不确定这些在Ruby或Python中的可访问性如何。


  

它包含powmod(x, y, m) ...

int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
    const BIGNUM *m, BN_CTX *ctx);

  

divm(a, b, m) ...

int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a,
    const BIGNUM *d, BN_CTX *ctx);

您可以在OpenSSL bn(3)找到完整的文档。