Java 双重加密2048 RSA?
我有个问题。我正在尝试使用RSA加密编写一个安全的聊天服务器。我正在尝试双重加密,以便每个客户端都知道消息只能来自其他客户端,并且它们是唯一可以读取消息的客户端。问题是,当我试图对一个1字符长的消息进行双重加密时,得到的第一个加密字节数组是256字节长,当然,你不能用另一个密钥再次加密,因为它太长了。我的问题是,如何使用下面的代码进行双重加密?理论上,我生成两个独立的密钥对,然后用其中一个的公钥加密字符串,然后用另一个的私钥加密字符串,反之亦然,用于解密字符串。相信我,我已经试过了Java 双重加密2048 RSA?,java,encryption,rsa,public-key-encryption,Java,Encryption,Rsa,Public Key Encryption,我有个问题。我正在尝试使用RSA加密编写一个安全的聊天服务器。我正在尝试双重加密,以便每个客户端都知道消息只能来自其他客户端,并且它们是唯一可以读取消息的客户端。问题是,当我试图对一个1字符长的消息进行双重加密时,得到的第一个加密字节数组是256字节长,当然,你不能用另一个密钥再次加密,因为它太长了。我的问题是,如何使用下面的代码进行双重加密?理论上,我生成两个独立的密钥对,然后用其中一个的公钥加密字符串,然后用另一个的私钥加密字符串,反之亦然,用于解密字符串。相信我,我已经试过了 packag
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来实现这些需求 您不应该试图发明自己的加密方法。如果遵循标准实践,很难正确操作,而且您更有可能创建一个真正安全的系统。关于如何满足需求的一些想法:
正如您所发现的,RSA适合加密相对较少的数据量。我还将注意到,使用RSA加密要比使用对称算法(如AES)加密慢得多。加密社区几十年来一直致力于提出安全和高性能的解决方案,例如,一种利用对称加密(如AES)性能的方法,同时拥有非对称加密(如RSA)的信任模式(无共享秘密)。所谓“双重加密”是指加密和签名吗?无论哪种方式,所有这些密码都有块大小,加密一个字节的输出大小将与加密十个字节的输出大小相同。通常,消息不是直接用RSA加密的。生成一个一次性使用对称密钥(如AES)来加密消息。然后用RSA加密(并可选择签名)传输会话密钥。“他们是唯一可以读取消息的人”-这已经是事实,除非您的私钥被泄露。“消息只能来自其他客户端”-实现这一点的唯一方法是建立信任链,以验证另一方公钥的真实性。@Thilo我有一种预感是这样的,但我找不到任何相关信息。谢谢@KevinKrumwiede是的,我知道,别担心。这并不是我正在创建的严重问题,而是我正在尝试扩展我的java知识!谢谢你的关心,我很感激。谢谢!这将对我今后的项目有很大帮助。