2013-11-20 39 views
2

我想在Java中实现Schnorr签名算法。我面临用大指数(例如MD5哈希数)计算功率的问题。BigInteger到BigInteger的功能(Schnorr签名)

有什么办法让BigInteger获得BigInteger的权力吗?

我需要计算(a^x * b^y)%z其中y是非常大的数字。有没有计算这种表达式的方法?

由于

+0

相关:HTTP: //math.stackexchange.com/q/176252 –

+2

有一个明显的原因是您在这里遇到问题。如果你将它提升到(2^127)的能力,即使是一个小到42的数字也会比这个星球上存在的内存占用更多​​的内存。 – cHao

+0

@cHao因为$ z $比较小,所以只需要几百个字节。 – CodesInChaos

回答

2

我终于找到了解决方案。

(a * b) % p = ((a % p) * (b % p)) % p 

所以我的例子是这样的:我可以非常快使用这种技术计算我的表达

(a^x * b^y) % z = (((a^x) % z) * ((b^y) % z)) % z; 

,或者使用的BigInteger在Java中:

BigInteger result = a.modPow(x, z).multiply(b.modPow(y, z)).mod(z); 
+2

+1用于解决您自己的问题并描述解决方案。老实说,我从来不会意识到这个问题是如此基础 - 从我第一次学习模块算术开始,这已经太长了。 –

1

号的最大值的BigInteger支持是2 Integer.MAX_VALUE的 -1。这个澄清的句子已被添加到Java 8中的BigInteger javadoc,但实施过程在相当长一段时间内一直存在。

的BigInteger必须支持范围为-2 Integer.MAX_VALUE的(不包括)值以2 Integer.MAX_VALUE的(不包括),并且可以支持该范围以外的值。

正如其他人指出的,您可能需要使用modPow而不是计算中间值。

作为对比,宇宙中估计有1080(或2 )个原子。

+0

我需要计算(a^x * b^y)%z,其中y是非常大的数字。有没有计算这种表达式的方法? –

4

对于Schnorr签名算法,您实际上需要组合的功率和模数运算。由于涉及的数字潜在巨大,因此仅仅进行权力运作是没有意义的。

您需要使用BigInteger classmodPow方法。