首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双重加密2048 RSA?

双重加密2048 RSA?
EN

Stack Overflow用户
提问于 2015-11-24 02:42:43
回答 1查看 1.7K关注 0票数 1

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

代码语言:javascript
复制
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;
      }



}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 04:05:06

您的需求是合理的,但您提出的解决方案从根本上讲是有缺陷的,应该被放弃。

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

你不应该试图发明你自己的密码学方法。这是很难得到正确的,你更有可能创建一个真正安全的系统,如果你遵循标准的做法。关于如何处理您的需求的一些想法:

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33884538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档