【问题标题】:RSA encryption chatting for javajava的RSA加密聊天
【发布时间】:2016-11-30 05:45:30
【问题描述】:

我想为java制作安全的聊天程序。 我输入了一些消息,但它会产生诸如 InvalidKeyException 之类的错误。 请解决它。谢谢!

这是错误信息!

=== RSA 加密 === java.security.InvalidKeyException: 没有安装的提供程序支持此密钥: (null) at javax.crypto.Cipher.chooseProvider(Cipher.java:893) 在 javax.crypto.Cipher.init(Cipher.java:1249) 在 javax.crypto.Cipher.init(Cipher.java:1186) 在 Crypto.RSACryption.encryptMessage(RSACryption.java:28) 在 Chat.Client.sendEncryptMessage(Client.java:236) 在 Chat.ClientGUI.actionPerformed(ClientGUI.java:191) 在 javax.swing.JTextField.fireActionPerformed(未知来源)在 javax.swing.JTextField.postActionEvent(未知来源)在 javax.swing.JTextField$NotifyAction.actionPerformed(未知来源) 在 javax.swing.SwingUtilities.notifyAction(Unknown Source) 在 javax.swing.JComponent.processKeyBinding(未知来源)在 javax.swing.JComponent.processKeyBindings(未知来源)在 javax.swing.JComponent.processKeyEvent(未知来源)在 java.awt.Component.processEvent(未知来源)在 java.awt.Container.processEvent(未知来源)在 java.awt.Component.dispatchEventImpl(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.KeyboardFocusManager.redispatchEvent(未知来源)在 java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(未知来源) 在 java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(未知 来源)在 java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(未知 来源)在 java.awt.DefaultKeyboardFocusManager.dispatchEvent(未知 源)在 java.awt.Component.dispatchEventImpl(未知源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Window.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$500(未知来源)在 java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue$4.run(未知源)在 java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)

这里是 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;
}

【问题讨论】:

  • 你应该学习如何调试你的代码。错误明确指出publicKey 为空?

标签: java encryption rsa


【解决方案1】:

Java 中的密码学是一个非常复杂的问题。开箱即用,JVM 安装了某些“providers”。 Java 中的 Provider 定义了一个用于加密操作的接口,并且有一个list of them available 用于在 JVM 中使用。每个提供者实现都有不同的支持算法和密钥大小。当您调用Cipher.getInstance 时,JVM 会查看所有已安装的提供程序并选择一个支持您请求的算法的提供程序。在您的情况下,异常告诉您没有向 JVM 注册支持您正在执行的加密类型的提供程序。这可能是由多种原因造成的。

  1. 它选择的提供程序不支持 RSA
  2. 不支持密钥大小/类型

当我想在 java 中进行加密时,我使用 BouncyCastle 作为提供者。您可以使用其他 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

【讨论】:

  • 这个异常的原因很简单:cipher.init(Cipher.ENCRYPT_MODE, publicKey);被调用,publicKey等于null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多