2013-11-20 77 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方法。