我必须为项目构建一个简单的授权服务器。服务器必须分发AES密钥以允许其客户端相互通信。
使用RSA加密AES密钥时,遇到此错误:“javax.crypto.IllegalBlockSizeException:数据不得超过117个字节”。 这很奇怪,因为我的AES密钥的长度是128位= 16字节。
以下是生成错误的代码:
private void createAndSendAES() throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, IOException, InvalidKeyException, BadPaddingException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
this.AESBlackboardKey = keyGen.generateKey(); // My AES key
byte[] raw = AESBlackboardKey.getEncoded();
System.out.println(raw.length); // Prints 16
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, this.clientPubKey);
SealedObject encryptedAESBlackboardKey = new SealedObject(this.AESBlackboardKey, cipher); // ERROR HERE
ObjectOutputStream outO = new ObjectOutputStream(this.clientSocket.getOutputStream());
outO.writeObject(encryptedAESBlackboardKey); //Transmitting the key over socket link
outO.flush();
System.out.println("AS: Blackboard AES key sent.");
}
有人知道16字节长AES密钥的加密如何使我遇到这种错误以及如何避免它?
提前致谢!
答案 0 :(得分:3)
您收到错误的原因是保存整个对象,而不仅仅是组成密钥的16个字节。所以你会例如在那里有完整的类名,类等的序列号。
如果您想继续使用SealedObject
,我会建议使用新的随机AES密钥加密"AES/CBC/PKCS5Padding"
。然后,您可以使用RSA算法加密该密钥(请务必使用"RSA/NONE/OAEPPadding"
完全指定,例如"RSA/NONE/PKCS1Padding"
或Cipher.doFinal()
)。
您也可以通过这种方式直接加密生成的数据。
另一种方法是简单地增加RSA密钥大小; RSA密钥大小1024越来越受到威胁,尝试使用最小2048的密钥大小(允许256 - 11 = 245字节的存储空间)。
请注意,您可以使用key.getEncoded()
从先前创建的AES密钥中检索16个字节。