2014-05-06 61 views
0

我正在開發一個項目,我需要在RMI網絡上顯示一些加密解密。 我正在使用RSA系統。 在解密時,我的代碼是給我下面的錯誤:javax.crypto.BadPaddingException:消息大於模數

javax.crypto.BadPaddingException: Message is larger than modulus 
    at sun.security.rsa.RSACore.parseMsg(RSACore.java:182) 
    at sun.security.rsa.RSACore.crypt(RSACore.java:112) 
    at sun.security.rsa.RSACore.rsa(RSACore.java:103) 
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:355) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2087) 
    at Node.decryptData(Node.java:463) 
    at Node.receiveMsgL(Node.java:451) 
    at MiniServer.callLeaderR(MiniServer.java:89) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

這是我的解密代碼:

private void decryptData(String PrivateK,byte[] data) throws IOException { 
     System.out.println("\n-------DECRYPTION STARTED----"); 
     byte[] descryptedData = null; 

     try { 
      PrivateKey privateKey = readPrivateKeyFromFile(PrivateK); 
      Cipher cipher = Cipher.getInstance("RSA"); 
      cipher.init(Cipher.DECRYPT_MODE, privateKey); 
      descryptedData = cipher.doFinal(data); 
      System.out.println("Decrypted Data: " + new String(descryptedData)); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println("------DECRYPTION COMPLETED-----");  
    } 

我一直在使用cipher.update(字節[]數據),同時加密嘗試。我有字符串數據,並使用string.getByte()在加密時將其轉換爲字節數組。 如果我使用update方法,它會給我一個IllegalBlockException的錯誤,即數據不能大於模數。

請幫我解決這個問題。我無法在我的代碼中找到該錯誤。

+0

如果不指定完整轉換,則RSA尤其是ECB模式([ECB/PKCS5Padding](http://stackoverflow.com/questions/6258047/java-default-crypto-aes-behavior))是默認值字符串)並不適合加密大量數據。你可以切換到AES(AES/CTR/PKCS5Padding應該是不錯的起點),還是隻需要使用RSA? –

+0

@ OlegEstekhin:RSA/ECB/*中的ECB Iirc只是一個虛擬值,必須放在那裏,因爲框架期望找到一個模式。 @ user36 ... Rsa本身只能對有限的數據進行加密(取決於密鑰大小,大約在250bytes左右)。通常也不建議直接使用RSA加密您的使用數據,但僅與它交換對稱密鑰。你的要求究竟是什麼?你可以使用SSL/TLS嗎? – Perseids

回答

2

像RSA這樣的非對稱密碼被設計用來加密短數據,通常是對稱密鑰,而大數據則用對稱分組密碼加密(對稱密鑰將與非對稱密碼交換)。 StackOverflow上的確有很多類似的問題和答案。 This one是一個很好的答案。

+0

@divanovPerseidsOleg我只是想加密像一個單詞的小數據。當我發送非常小的字符串「msg」時,它給了我錯誤。 – user3606758

+0

你可以像'assert data.length * 8 <((RSAPrivateKey)privateKey).getModulus()。bitLength();'在'decryptData()''中檢查數據長度。 – divanov