我使用AES加密了一个字符串。我给了AES一把钥匙。现在,我试图用RSA加密给定密钥(直到这里一切顺利),现在我需要再次用RSA加密这个加密密钥。我收到错误“数据不能超过117个字节”。
public String encrypt(String DATA,String key_string) throws Exception {
String separator = "//msit//";
byte[] data = key_string.getBytes();
MessageDigest sha = MessageDigest.getInstance("SHA-1");
data = sha.digest(data);
data = Arrays.copyOf(data, 16); // use only first 128 bit
SecretKey key = new SecretKeySpec(data, "AES");
String final_matter = DATA + separator;
System.out.println(final_matter);
ecipher = Cipher.getInstance("AES");
ecipher.init(Cipher.ENCRYPT_MODE, key);
byte[] utf8 = final_matter.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
return new sun.misc.BASE64Encoder().encode(enc);
}
答案 0 :(得分:1)
RSA密钥可以加密的最大数据量等于其模数长度。因此,1024位RSA密钥只能加密128个字节。您可能正在使用PKCS#1填充,这进一步将可能的大小减少到117个字节。
您的AES密钥应小于最大值。最大可能的AES密钥大小为256位,即32字节。
请检查您的代码并确保您只是尝试加密密钥数据而不是其他任何内容。
根据您上面的评论,您似乎正在加密太多数据。请尝试以下方法:
使用发件人的私钥对AES密钥进行签名,但保持结果分开。
使用收件人的公钥加密AES密钥。
将两个部分发送给收件人。
使用私钥签名的结果是一块大小与密钥模数相等的数据。因此,您无法使用相同长度的公钥对其进行加密。您的方案已被破坏,应根据我的建议进行修改。
我强烈建议您寻找现有的PKI系统来代替本土的任何东西。也许EJBCA?