2016-11-30 3 views
-2

Ich möchte sichere Chat-Programm für Java machen. Ich habe eine Nachricht eingegeben, aber es tritt ein Fehler auf, z. B. InvalidKeyException. bitte lösen Sie es. Vielen Dank!RSA-Verschlüsselung im Chat für Java

es ist eine Fehlermeldung!

=== RSA-Verschlüsselung === java.security.InvalidKeyException: Nein installiert Provider unterstützt diesen Schlüssel: (null) bei javax.crypto.Cipher.chooseProvider (Cipher.java:893) bei javax. crypto.Cipher.init (Cipher.java:1249) um javax.crypto.Cipher.init (Cipher.java:1186) um Crypto.RSACryption.encryptMessage (RSACryption.java:28) um ​​ Chat.Client.sendEncryptMessage (Client.java:236) bei Chat.ClientGUI.actionPerformed (ClientGUI.java:191) bei javax.swing.JTextField.fireActionPerformed (Unknown Source) bei javax.swing.JTextField.postActionEvent (Unknown Source) bei javax.swing.JTextField $ NotifyAction.actionPerformed (Unbekannte Quelle) bei javax.swing.SwingUtilities.notifyAction (Unbekannte Quelle) um javax.swing.JComponent.processKeyBinding (Unbekannte Quelle) um javax.swing.JComponent.processKeyBindings (Unknown Source) bei javax.swing.JComponent.processKeyEvent (Unknown Source) bei java.awt.Component.processEvent (Unknown Source) bei java.awt.Container.processEvent (Unknown Source) bei java.awt.Component. dispatchEventImpl (Unknown Source) bei java.awt.Container.dispatchEventImpl (Unknown Source) bei java.awt.Component.dispatchEvent (Unknown Source) bei java.awt.KeyboardFocusManager.redispatchEvent (Unknown Source) bei java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent (Unknown Source) bei java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent (Unbekannt Quelle) bei java.awt.DefaultKeyboardFocusManager.typeAheadAssertions (Unbekannt Quelle) bei java.awt.DefaultKeyboardFocusManager.dispatchEvent (Unbekannt Quelle) bei java.awt.Component.dispatchEventImpl (Unknown Source) bei java.awt.Container.dispatchEventImpl (Unknown Source) bei java.awt.Window.dispatchEventImpl (Unknown Source) bei java.awt.Component.dispatchEvent (Unbekannte Quelle) um java.awt.EventQueue.dispatchEventImpl (unbekannte Quelle) um java.awt.EventQueue.access $ 500 (unbekannte Quelle) um java.awt.EventQueue $ 3.r un (Unknown Source) bei java.awt.EventQueue $ 3.run (Unknown Source) bei java.security.AccessController.doPrivileged (native Methode) bei java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Unbekannt Quelle) bei java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Unbekannt Quelle) bei java.awt.EventQueue $ 4.run (Unbekannte Quelle) um java.awt.EventQueue $ 4.run (Unbekannte Quelle) um java.security.AccessController.doPrivileged (Native Methode) unter java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Unbekannt Quelle) bei java.awt.EventQueue.dispatchEvent (Unbekannte Quelle) um java.awt.EventDispat chThread.pumpOneEventForFilters (Unknown Source) bei java.awt.EventDispatchThread.pumpEventsForFilter (Unknown Source) bei java.awt.EventDispatchThread.pumpEventsForHierarchy (Unbekannt Quelle) bei java.awt.EventDispatchThread.pumpEvents (Unknown Source) auf Java. awt.EventDispatchThread.pumpEvents (Unbekannte Quelle) um java.awt.EventDispatchThread.run (Unknown Source)

Und hier ist der Quelltext der Methode encryptMessage.

public byte[] encryptMessage(String plainText, PublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 
    System.out.print("\n Plaintext : " + plainText + "\n"); 
    byte[] t0 = plainText.getBytes(); 
    for (byte b : t0) System.out.printf("%02X ", b); 
    System.out.println("\n Plaintext Length : " + t0.length + " byte"); 

    System.out.println("\n=== RSA Encryption ==="); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
    byte[] b0 = cipher.doFinal(t0); 
    System.out.print("\n\n Ciphertext : "); 
    for (byte b : b0) System.out.printf("%02X ", b); 
    System.out.println("\n Ciphertext Length : " + b0.length + " byte"); 

    return b0; 
} 
+1

Sie sollten lernen, wie Sie Ihren Code debuggen. Der Fehler besagt eindeutig, dass "publicKey" null ist? –

Antwort

0

Kryptographie in Java ist ein sehr komplexes Problem. Standardmäßig ist die JVM mit bestimmten "providers" installiert. Der Provider in Java definiert eine Schnittstelle für Kryptografieoperationen und es gibt eine list of them available für die Verwendung in der JVM. Jede Anbieterimplementierung verfügt über verschiedene unterstützte Algorithmen und Schlüsselgrößen. Wenn Sie Cipher.getInstance aufrufen, sucht die JVM nach allen installierten Providern und wählt eine aus, die den von Ihnen angeforderten Algorithmus unterstützt. In Ihrem Fall weist die Ausnahme darauf hin, dass bei der JVM, die die Art der Verschlüsselung unterstützt, kein Provider registriert ist. Dies kann verschiedene Gründe haben.

  1. RSA ist nicht mit dem Provider unterstützt es ausgewählt
  2. Die Schlüsselgröße/Typ ist nicht
  3. unterstützt

Als ich wollten in Java Kryptographie I BouncyCastle als Provider verwenden. Sie können den Anbieter der Hüpfburg mit der anderen Methode Cipher.getInstance angeben oder die Hilfs-APIs von BouncyCastle verwenden, so dass Sie die Klasse Cipher nicht direkt verwenden müssen. Überprüfen Sie eine RSA encrypt/decrypt example here.

Als Nebenbemerkung müssen Sie Unlimited Strength JCE components installieren, wenn Sie vorhaben, AES 256 oder höher zu verwenden und Oracle JDK zu verwenden.

http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

+0

Die Ursache dieser Ausnahme ist sehr einfach: 'cipher.init (Cipher.ENCRYPT_MODE, publicKey);' wird aufgerufen mit 'publicKey' gleich' null'. –