2011-12-24 69 views
0

我怎麼能在這條巨蟒一樣的效果(使用SAGE)代碼:的BigInteger冪與負數

def elGamalDecrypt(c1, c2, p, x): 
    return Mod(c2*c1^(-x),p) 

與標準的Java 7庫?所有數字都是BigInteger

我試了很多都沒有用。在Python中它非常簡單而且FAST。

+0

? '^'在Python中是按位異或,不是冪指數;並且模數不需要函數,因爲'%'操作符就足夠了。 –

+0

el gamal中的一個按位xor肯定是錯誤的。除非編譯器對指數+模數進行了一些特殊的優化,否則將它作爲單獨的操作編寫將會非常緩慢且佔用大量內存。 – CodesInChaos

+0

當然,如果Java中缺少任何加密函數,您應該首先嚐試Bouncy Castle庫,它們當然會執行El-Gamal加密/解密。 –

回答

3

在Java 7中BigInteger類有一個modPow方法,它處理模冪。所以,像下面應該工作(雖然我沒有測試過):

c2.multiply(c1.modPow(x.negate(), p)).mod(p) 

modPow方法將只接受一個負指數-x如果c1p互質。 (該名稱p表明p是素數,如果c1p不互爲素,c1將整除p,因此冪將毫無意義,所以我懷疑這會不會是一個問題。)

+0

對不起,我無法直接鏈接到'modPow'方法來工作。 SO不接受全名作爲鏈接,因爲它有空格。 –

+0

我想'-x'應該是'x.negate()',對吧?我從來沒有用過java之前... – Flavius

+0

好,所以我測試了它。 'c2.multiply(c1.modPow(x.negate(),p)).mod(p)'似乎工作。這是正確的嗎? – Flavius

0

這也應該這樣做,因爲c2 * c1^-x = c2/(c1^x)

BigInteger elGamalDecrypt(BigInteger c1, BigInteger c2, BigInteger p, int x) { 
    return c2.divide(c1.pow(x)).mod(p); 
} 
+1

我認爲OP在這裏做模冪運算,在這種情況下,你的答案不會有幫助。 –

+0

@LukeWoodward爲什麼不呢?模冪運算的定義與取冪運算相同,然後用模運算,對嗎?這只是效率低下。 – harold

+0

不幸的是,這是行不通的。正如我所說的,所有的數字都是BigInteger,並且在運行時我得到java.math.BigInteger中的pow(int)不能應用於(java.math.BigInteger)'。是的,這是關於模數求冪的,但我不知道如何在java中完成。 – Flavius