我必须为一个项目构建一个简单的授权服务器。服务器必须分发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密钥的加密是如何让我遇到这种错误的吗?以及如何避免这种错误?
提前感谢!
出现错误的原因是保存了整个对象,而不仅仅是组成键的16个字节。所以你会有完整的类名,类的序列号等等。
如果您想继续使用SealedObject
,那么我建议使用新的随机AES密钥和"AES/CBC/PKCS5Padding"
进行加密。然后,您可以使用RSA算法对该密钥进行加密(请确保完全指定,例如"RSA/NONE/OAEPPadding"
或"RSA/NONE/PKCS1Padding"
),只需使用Cipher.doFinal()
即可。
您也可以通过这种方式直接加密生成的数据。
另一种方法是简单地增加RSA密钥大小;1024的RSA密钥大小越来越受到威胁,请尝试使用最小2048的密钥大小(允许256-11=245字节的存储空间)。
请注意,您可以使用key.getEncoded()
从以前创建的AES密钥中检索16个字节。