【问题标题】:BigInteger exponentiation with negative numberBigInteger 负数取幂
【发布时间】:2011-12-24 10:01:22
【问题描述】:

我怎样才能在这个python(使用sage)代码中做同样的事情:

def elGamalDecrypt(c1, c2, p, x):
    return Mod(c2*c1^(-x),p)

使用标准 Java 7 库?所有号码都是BigInteger

我尝试了很多都没有成功。在 Python 中,它非常简单且快速。

【问题讨论】:

  • ? ^ 在 Python 中是按位异或,而不是求幂;并且取模不需要任何函数,% 运算符就足够了。
  • el gamal 中的按位异或肯定是错误的。除非编译器对求幂+取模进行了一些特殊的优化,否则将其编写为单独的操作将非常缓慢且占用大量内存。
  • 当然,如果 Java 中缺少任何加密功能,您可能应该首先尝试 Bouncy Castle 库,它们当然会执行 El-Gamal 加密/解密。

标签: java python algorithm security encryption


【解决方案1】:

Java 7 中的 BigInteger 类有一个 modPow 方法,用于处理模幂运算。所以,类似下面的东西应该可以工作(虽然我还没有测试过):

c2.multiply(c1.modPow(x.negate(), p)).mod(p)

如果c1p 互质,modPow 方法将只接受负指数-x。 (名称p 表明p 是质数,如果c1p 不是互质数,c1 将被p 整除,因此求幂没有意义,所以我怀疑这不会是一个问题。)

【讨论】:

  • 抱歉,我无法直接获得指向 modPow 方法的链接以使其正常工作。 SO 不接受全名作为链接,因为其中包含空格。
  • 我想-x 应该是x.negate(),对吧?我以前从未使用过 java...
  • 好的,我已经测试过了。 c2.multiply(c1.modPow(x.negate(), p)).mod(p) 似乎有效。对吗?
  • @Flavius:我相信你是对的。我确实说过我没有测试过!我现在更新了我的答案。在 Java 中使用 BigIntegers 有点尴尬,因为您必须使用方法而不是常规的算术运算符。
  • 请在末尾添加.mod(p),我会接受。我也进行了几次测试,这绝对是必需的。
【解决方案2】:

自从c2 * c1^-x = c2 / (c1 ^ x):

BigInteger elGamalDecrypt(BigInteger c1, BigInteger c2, BigInteger p, int x) {
    return c2.divide(c1.pow(x)).mod(p);
}

【讨论】:

  • 我认为 OP 在这里进行模幂运算,在这种情况下,您的答案将无济于事。
  • @LukeWoodward 为什么不呢?模幂运算在定义上与取幂后跟模数相同,对吧?这只是效率低下。
  • 不幸的是,这行不通。正如我所说,所有数字都是 BigInteger,在运行时我得到pow(int) in java.math.BigInteger cannot be applied to (java.math.BigInteger)。是的,它是关于模幂运算的,但我不知道如何在 java 中做到这一点。
  • 是的,这是一个长镜头...... Java BigInteger 只支持modPow。我想您必须重新排列表达式才能使用modPow
  • @harold:对负指数进行模幂运算与进行正常求幂并在除以模数后取余数不同。例如,5^-95 (mod 97) 是 5,而 5^-95 是一个非常小的数字,除以 97 后的余数不会得到 5。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2011-12-31
  • 2017-12-03
相关资源
最近更新 更多