如何使用RSA加密AES密钥而不会遇到“javax.crypto.IllegalBlockSizeException:数据不能超过117个字节”

时间:2013-11-28 09:58:07

标签: java sockets encryption aes rsa

我必须为项目构建一个简单的授权服务器。服务器必须分发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密钥的加密如何使我遇到这种错误以及如何避免它?

提前致谢!

1 个答案:

答案 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个字节。