运行 具有巨大基数和指数的计算 java

Run a calculation with a huge base and exponent in java

我需要在盲签名方案中进行非常大的计算才能获得盲签名。我已经 在 java 中使用 BigInteger class 尝试过这个。我相信我当前的代码是正确的,因为它 运行s 但最终抛出异常,因为数字会溢出支持的范围。

我最初尝试的计算如下所示。

BigInteger blindedToken = hashedToken.multiply(randomElementDecimal.pow(formattedValue.multiply(BigInteger.valueOf(3))));

这行不通,因为 BigInteger pow() 必须采用 int 值。因此,I used my own Helpers class to do this.

class Helpers { 
    public static BigInteger pow(BigInteger base, BigInteger exponent) {
          BigInteger result = BigInteger.ONE;
          while (exponent.signum() > 0) {
            if (exponent.testBit(0)) result = result.multiply(base);
            base = base.multiply(base);
            exponent = exponent.shiftRight(1);
          }
          return result;
        }
}

因此更新后的计算如下所示。

BigInteger blindedToken = Helpers.pow(randomElementDecimal, formattedValue.multiply(BigInteger.valueOf(3)));
blindedToken = blindedToken.multiply(hashedToken);
System.out.println(blindedToken);

结果为

Z = 941180828215645688530913292077221835722091184537123007963440625299702649269*1631434789^(222347888349073615524064151195238689903425040008399562092481278391150317944919*3)

Z = h(Tid)*R^(public 指数 * 格式值)

我已经通过将散列值从 SHA-256 的结果更改为 SHA-1 来缩短数字,但我仍然面临问题。

似乎 运行 永远 我认为它会溢出,因为 计算量太大 .

我只是想知道是否有 另一种方法来计算和存储值 或者是否会支持其他语言,例如 Python?

是的,这种数字的幂在任何硬件上都需要数十亿年。

通常,对于加密货币,所有这些都需要取模,这就是问题所在。 x^y % z,其中 y 是一些不靠谱的数字,但 z 的大小合理,可以快速完成,但不能用 Math.pow.

因为这是关于密码学的,所以你缺少的一点是你需要一个模数。在密码学中,我们主要研究有限模数。看来您正在尝试像盲签名一样的 RSA,因此您需要打开模数。

他们使用 modPow of the BigInteger Class and available since JDK1.1. This uses the modular version of the square-and multiply 技术,它具有 O(log n) 复杂度,其中 n 是指数。在每一步中,中间值最多可以是 m^2.

modPow(BigInteger exponent, BigInteger m)

Returns a BigInteger whose value is (thisexponent mod m). (Unlike pow, this method permits negative exponents.)