2016-07-22 22 views
0

在我發佈我的代碼之前,我認爲最好先佈置幾件事情。在java中存儲大量的RSA加密

目標:

一對夫婦少量的執行非常基本的RSA加密。對於那些熟悉RSA加密的人,我已經發布了下面算法使用的值。

當前RSA數字/值:

P = 29

Q = 31

N = P * Q

披=((P-1)*(Q -1))

E = 11

我的問題:

當我試圖解密我的代碼時出現問題。加密按設計工作。

代碼:

long[] mesg = new long[]{8, 7, 26, 28}; 
long[] encrypted_mesg = new long[mesg.length]; 

for(int i=0; i<mesg.length; i++){ 
    encrypted_mesg[i]=(long)((Math.pow(mesg[i],E))%N); 
    System.out.print(encrypted_mesg[i] + " "); 
} 
System.out.println(); 

//Decrpyt (not functioning-long to small, Big Integer not working) 
for(int j=0; j<encryp_mesg.length; j++){ 
    BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 
    System.out.print(decrypt.toString() + " "); 
} 

最初的問題是事實,d(私有指數),當作爲指數應用,是方式大長。我做了一個快速的谷歌搜索,並決定嘗試和實施BigInteger。當我運行程序時,它拋出這個錯誤:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Infinity" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 

at java.math.BigInteger.<init>(BigInteger.java:461) 
at java.math.BigInteger.<init>(BigInteger.java:597) 
at RSA_Riddles.main(RSA_Riddles.java:23)** 

我試圖來解決這個問題:

說實話,我沒試過真的沒有什麼東西,因爲我知道答案不計算到無窮大,但BigInteger認爲它的確如此。無論如何,我可以存儲一個數字,如130^611?如果是這樣,怎麼樣?

大問題:

我如何可以存儲執行解密所需的值?

預先感謝任何嘗試和幫助我的人!

+0

我不知道它是設計還是運氣,你只測試值高達28時,當你的加密計算產生了錯誤的結果,從大多數值29以上解密同樣應該是mod n:m = c^d mod n 。另外,對於你的玩具尺寸來說,冪指數和模數分別對於你的玩具尺寸幾乎沒有實際意義,但是爲了安全尺寸而做它會比你的一生(或者你的計算機)要長得多,所以實際的實現會像維基百科中解釋的那樣交錯 - 然後是玩具大小你根本不需要bignums。 –

回答

2

您的問題正在發生,因爲您正在使用基本數據類型進行計算,然後將這些基元存儲在BigInteger中。這違背了使用BigInteger的目的。讓我們來看看問題的行:

BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 

當Java的評估這條線,它會首先借此表達

Math.pow(encryp_mesg[j],D) + "" 

,並評估它。然後它會將此評估的結果傳遞給BigInteger的構造函數。但是,此時您已經超出了您正在使用的數據類型的範圍。相反,你應該做的數學與BigIntegers,像這樣:

BigInteger e = new BigInteger(Integer.toString(encryp_mesg[j])); 
BigInteger decrypt = e.pow(D); 

現在你只是做使用的BigInteger計算,只有在你已經有存儲在原始數據類型的基本數據類型值存儲。

+0

謝謝,我會立即改變執行。另外,BigInteger是否有任何限制?如果是這樣,他們是什麼? – jpgamer31

+0

很高興能幫到你!如果它適合你,那麼如果你可以遵循SO禮儀並且接受答案,那將是非常好的。 BigIntegers是'任意精度'的,這意味着它們支持的數量與你的機器擁有的資源數量相當(你不太可能跑到這個極限) – James

+0

我是一個小菜一碟。這是我的第一個問題。我如何接受答案? – jpgamer31