2012-03-11 65 views
4

我在使用Java編寫RSA應用程序時遇到了問題。使用RSA加密長字符串(Java)

我必須從文件中讀取字符串,對其進行加密,然後將加密的字符串保存到新文件中。

我的RSA密鑰長度爲1024位。

代碼的部分是哪裏的問題,如下:

  readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length); 

      while(readBytes != -1){ 
       encodedContent = ciph.update(bytesToBeEncoded, 0, readBytes); 
       out.write(encodedContent); 
       bytesToBeEncoded= new byte[(KEY_SIZE/8)-11]; 
       readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length);     
      } 

      encodedContent = ciph.doFinal(); 
      out.write(encodedContent); 

其中變量是這樣定義的:

 byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

     FileInputStream in = new FileInputStream(new File(file1)); 
     FileOutputStream out = new FileOutputStream(new File(file2)); 
     int readBytes; 

的一點是,當我加密一個欠於─ 117個字節的字符串,它完美(加密和然後解密孔),但是當尺寸較大時,應用程序將引發此異常:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes 

通過拋出該異常:

encodedContent = ciph.doFinal(); 

我不知道問題出在哪裏,我必須做的事情。

任何人都可以幫助我嗎?謝謝。

對不起,我的英語。

+1

你真的需要使用RSA加密你的數據嗎?標準模式是使用RSA加密隨機對稱密鑰,並使用該對稱密鑰加密實際數據。 – CodesInChaos 2012-03-11 16:33:44

+0

您應該收聽CodeInChaos,而不是使用RSA密鑰直接加密數據。這是違反所有良好做法的。此外,您的緩衝區大小根本不應與輸入大小相關。 – 2012-03-13 23:49:49

回答

4

問題在於如何初始化您正在讀取輸入的字節數組。您正在根據RSA密鑰的大小設置大小,而不是根據輸入流的預期大小。

byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

密鑰大小爲1024位,所以1024/8 -11 = 128-11 = 117字節。這是您可以從流中讀取的數據量,並且不應與RSA密鑰的大小相關。

您應該將字節數組初始化爲您需要讀入的最大數據大小,這將避免出現異常。例如:

byte[] bytesToBeEncoded = 1024; 

將允許1024個字符的最大輸入字符串。

+0

嗨史蒂文,感謝您的快速回答。 我donde(byte [] bytesToBeEncoded =新字節[1024]),但問題仍然存在。 :S程序繼續拋出相同的異常。不管怎麼說,還是要謝謝你。 :) – Shuli 2012-03-11 15:01:13

+0

避免我的評論,我沒有看到你寫的是一個例子。現在我將數組初始化爲要讀取的內容的大小,並稍微修改了我的代碼,並且它工作正常。 ^^非常感謝! – Shuli 2012-03-11 15:24:24