2016-11-30 19 views
-2

私はjavaのための安全なチャットプログラムを作りたいと思う。 メッセージを入力しましたが、InvalidKeyExceptionなどのエラーが発生しました。 解決してください。ありがとうございました!JavaのRSA暗号化チャット

エラーメッセージです!

=== RSA暗号化=== java.security.InvalidKeyException:(ヌル) javax.crypto.Cipher.chooseProvider(Cipher.java:893)で のjavaxで:いいえインストールされているプロバイダはこのキーをサポートしています。 crypto.Cipher.init(Cipher.java:1249)at にあるjavax.crypto.Cipher.init(Cipher.java:1186) にあるCrypto.RSACryption.encryptMessage(RSACryption.java:28)Cha​​t.Client.sendEncryptMessageで javax.swing.JTextField.postActionEvent(不明なソース)で javax.swing.JTextField.fireActionPerformed(不明なソース)で Chat.ClientGUI.actionPerformed(ClientGUI.java:191)でClient.java:236) (未知のソース) ( ) にあるjavax.swing.JComponent.processKeyBinding(不明なソース)、javax.swing.JComponent.processKeyBindings (未知のソース) にある のjava.awt.Container.processEvent(不明なソース)で、 の のjava.awt.Container.processEvent(不明なソース)で、java.awt.Component.processEventで java.awt.KeyboardFocusManager.redispatchEvent(不明なソース)で java.awt.Component.dispatchEvent(不明なソース)で java.awt.Container.dispatchEventImpl(不明なソース)でdispatchEventImpl(不明なソース) java.awt.DefaultKeyboardFocusManager.dispatchEventで java.awt.DefaultKeyboardFocusManager.typeAheadAssertionsでjava.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(不明 出典)(不明 出典)(不明で0 java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(不明なソース) ソース) のjava.awt.Container.dispatchEventImpl(不明なソース) のjava.awt.Window.dispatchEventImpl(不明なソース) のjava.awt.Component.dispatchEvent (Unknown Source)at java.awt.EventQueue.dispatchEventImpl(不明なソース) でjava.awt.EventQueue.access $ 500(不明なソース) でjava.awt.EventQueue $ 3.r で すべてjava.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(不明 出典)で java.security.AccessController.doPrivileged(ネイティブメソッド)で java.awt.EventQueue $ 3.run(不明なソース)で、国連(不明なソース) java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(不明な ソース)java.awt.EventQueue $ 4.run(不明なソース) でjava.awt.EventQueue $ 4.run(不明なソース) java.security.AccessController.doPrivileged (未知のソース)at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege chThread.pumpOneEventForFilters(不明なソース)は、Javaでjava.awt.EventDispatchThread.pumpEventsでjava.awt.EventDispatchThread.pumpEventsForHierarchyでjava.awt.EventDispatchThread.pumpEventsForFilter(不明なソース) で (不明 出典)(不明なソース) 。 awt.EventDispatchThread.pumpEvents(不明なソース)( )java.awt.EventDispatchThread。(不明なソース)

そして、ここには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

コードをデバッグする方法を学ぶ必要があります。エラーは 'publicKey'がヌルであることを明確に述べていますか? –

答えて

0

Javaの暗号化は非常に複雑な問題です。ボックスの外では、JVMには特定の「providers」がインストールされています。 Javaのプロバイダは、暗号化操作用のインタフェースを定義しており、JVMで使用するためにlist of them availableがあります。各プロバイダの実装には、サポートされているさまざまなアルゴリズムとキーがあります。 Cipher.getInstanceを呼び出すと、JVMはインストールされているすべてのプロバイダを調べ、要求したアルゴリズムをサポートするものを選択します。あなたのケースでは、例外は、あなたが行っている暗号化のタイプをサポートするJVMに登録されているプロバイダがないことを伝えています。これは、いくつかの理由が原因である可能性があります。私はプロバイダとしてBouncyCastleを使用するJavaで暗号技術のしたかったら、それは

  • キーサイズ/タイプイマイチを選択したプロバイダでサポート

    1. RSAイマイチは

    を支持しました。他のCipher.getInstanceメソッドを使用して弾力のある城のプロバイダを指定するか、BouncyCastleのヘルパーAPIを使用して、Cipherクラスを直接使用する必要はありません。 RSA encrypt/decrypt example hereをチェックしてください。

    付録として、AES 256以上を使用し、Oracle JDKを使用する予定の場合は、Unlimited Strength JCE componentsをインストールする必要があります。

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

  • +0

    この例外の原因は非常に簡単です: 'cipher.init(Cipher.ENCRYPT_MODE、publicKey);'が 'null 'と等しい' publicKey'で呼び出されています。 –