如何使用 RSA 加密 AES 密钥而不会遇到"javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 byt



我必须为一个项目构建一个简单的授权服务器。服务器必须分发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个字节。

相关内容

最新更新