Java 双重加密2048 RSA?

Java 双重加密2048 RSA?,java,encryption,rsa,public-key-encryption,Java,Encryption,Rsa,Public Key Encryption,我有个问题。我正在尝试使用RSA加密编写一个安全的聊天服务器。我正在尝试双重加密,以便每个客户端都知道消息只能来自其他客户端,并且它们是唯一可以读取消息的客户端。问题是,当我试图对一个1字符长的消息进行双重加密时,得到的第一个加密字节数组是256字节长,当然,你不能用另一个密钥再次加密,因为它太长了。我的问题是,如何使用下面的代码进行双重加密?理论上,我生成两个独立的密钥对,然后用其中一个的公钥加密字符串,然后用另一个的私钥加密字符串,反之亦然,用于解密字符串。相信我,我已经试过了 packag

我有个问题。我正在尝试使用RSA加密编写一个安全的聊天服务器。我正在尝试双重加密,以便每个客户端都知道消息只能来自其他客户端,并且它们是唯一可以读取消息的客户端。问题是,当我试图对一个1字符长的消息进行双重加密时,得到的第一个加密字节数组是256字节长,当然,你不能用另一个密钥再次加密,因为它太长了。我的问题是,如何使用下面的代码进行双重加密?理论上,我生成两个独立的密钥对,然后用其中一个的公钥加密字符串,然后用另一个的私钥加密字符串,反之亦然,用于解密字符串。相信我,我已经试过了

package client.crypto;

import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;

public class CryptoUtils {

private static final String ALGORITHM = "RSA";

public static KeyPair getKeyPair() {
    KeyPairGenerator keyGen = null;
    try {
        keyGen = KeyPairGenerator.getInstance(ALGORITHM);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
      keyGen.initialize(2048);
      final KeyPair key = keyGen.generateKeyPair();
    return key;
}

 public static byte[] encrypt(String text, Key key) {
        byte[] cipherText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);
          cipher.init(Cipher.ENCRYPT_MODE, key);
          cipherText = cipher.doFinal(text.getBytes());
        } catch (Exception e) {
          e.printStackTrace();
        }
        return cipherText;
      }

 public static String decrypt(String text, Key key) {
        byte[] dectyptedText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);

          cipher.init(Cipher.DECRYPT_MODE, key);
          dectyptedText = cipher.doFinal(text.getBytes());

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

        return new String(dectyptedText);
      }
 public static byte[] decryptToBytes(String text, Key key) {
        byte[] dectyptedText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);

          cipher.init(Cipher.DECRYPT_MODE, key);
          dectyptedText = cipher.doFinal(text.getBytes());

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

        return dectyptedText;
      }

 public static byte[] encrypt(byte[] bytes, Key key) {
        byte[] cipherText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);
          cipher.init(Cipher.ENCRYPT_MODE, key);
          cipherText = cipher.doFinal(bytes);
        } catch (Exception e) {
          e.printStackTrace();
        }
        return cipherText;
      }

 public static String decrypt(byte[] bytes, Key key) {
        byte[] dectyptedText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);

          cipher.init(Cipher.DECRYPT_MODE, key);
          dectyptedText = cipher.doFinal(bytes);

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

        return new String(dectyptedText);
      }

 public static byte[] decryptToBytes(byte[] bytes, Key key) {
        byte[] dectyptedText = null;
        try {
          final Cipher cipher = Cipher.getInstance(ALGORITHM);

          cipher.init(Cipher.DECRYPT_MODE, key);
          dectyptedText = cipher.doFinal(bytes);

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

        return dectyptedText;
      }



}

您的需求是合理的,但您提出的解决方案存在根本缺陷,应该放弃

您应该回到您的需求,并尝试使用标准技术和API来实现这些需求

您不应该试图发明自己的加密方法。如果遵循标准实践,很难正确操作,而且您更有可能创建一个真正安全的系统。关于如何满足需求的一些想法:

  • 您需要建立某种方式来管理/分发证书,以便在进行通信的实体之间建立信任。通常,证书(基本上是由您信任的人签名的签名公钥)可以自由使用和分发
  • 要允许验证发件人的身份(以及邮件未被修改),您将使用数字签名(非加密)。这里发生的是,对消息的内容计算“摘要”或“哈希”,从而产生相对较少的字节数,而不管消息的长度如何。摘要是用发送方的私钥签名的。发送方的公钥可用于验证签名
  • 要允许邮件仅由预期收件人读取,您将使用加密。这里发生的事情是生成一个随机的、一次性使用的密码短语并用于加密消息。使用预期收件人的公钥对密码短语进行加密。需要收件人的私钥才能恢复密码短语,然后才能对邮件进行解密。只需多次加密密码短语,即可为多个收件人加密同一份邮件副本
  • 您需要选择一种消息格式,该格式允许解析已签名、加密的消息,以选择各个部分。例如CMS(加密消息格式)

  • 正如您所发现的,RSA适合加密相对较少的数据量。我还将注意到,使用RSA加密要比使用对称算法(如AES)加密慢得多。加密社区几十年来一直致力于提出安全和高性能的解决方案,例如,一种利用对称加密(如AES)性能的方法,同时拥有非对称加密(如RSA)的信任模式(无共享秘密)。

    所谓“双重加密”是指加密和签名吗?无论哪种方式,所有这些密码都有块大小,加密一个字节的输出大小将与加密十个字节的输出大小相同。通常,消息不是直接用RSA加密的。生成一个一次性使用对称密钥(如AES)来加密消息。然后用RSA加密(并可选择签名)传输会话密钥。“他们是唯一可以读取消息的人”-这已经是事实,除非您的私钥被泄露。“消息只能来自其他客户端”-实现这一点的唯一方法是建立信任链,以验证另一方公钥的真实性。@Thilo我有一种预感是这样的,但我找不到任何相关信息。谢谢@KevinKrumwiede是的,我知道,别担心。这并不是我正在创建的严重问题,而是我正在尝试扩展我的java知识!谢谢你的关心,我很感激。谢谢!这将对我今后的项目有很大帮助。