运行 具有巨大基数和指数的计算 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.)
我需要在盲签名方案中进行非常大的计算才能获得盲签名。我已经 在 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.)