我正在尝试用Java实现Schnorr签名算法。我面临着用大指数计算功率的问题(例如MD5哈希数)。
有没有办法让BigInteger掌握BigInteger的力量?
我需要计算(a ^ x * b ^ y)%z,其中y是非常大的数字。有没有计算这种表达的方法?
由于
答案 0 :(得分:4)
对于Schnorr签名算法,您实际上需要组合功率和模数运算。仅仅进行一次动力操作是没有意义的,因为所涉及的数字可能非常庞大。
您需要使用BigInteger
class的modPow
方法。
答案 1 :(得分:2)
我终于找到了解决方案。我可以使用这种技术非常快速地计算我的表达式:
(a * b) % p = ((a % p) * (b % p)) % p
所以我的例子看起来像这样:
(a^x * b^y) % z = ( ((a^x) % z) * ((b^y) % z) ) % z;
或者,在Java中使用BigInteger:
BigInteger result = a.modPow(x, z).multiply( b.modPow(y, z) ).mod(z);
答案 2 :(得分:1)
没有。 BigInteger支持的最大值是2 Integer.MAX_VALUE -1。这个澄清句子被添加到Java 8中的BigInteger javadoc,但实现已经相当长一段时间了。
BigInteger必须支持-2 Integer.MAX_VALUE (不包括)+2 Integer.MAX_VALUE (不包括)范围内的值,并且可以支持该范围之外的值。
正如其他人所指出的,您可能希望使用modPow
而不是计算中间值。
作为比较,宇宙中有一个估计的1080(或2 265 )原子。