如何使用RSA加密AES密钥而不遇到;javax.crypto.IllegalBlockSizeException:数据长度不得超过117字节”;

如何使用RSA加密AES密钥而不遇到;javax.crypto.IllegalBlockSizeException:数据长度不得超过117字节”;,java,sockets,encryption,aes,rsa,Java,Sockets,Encryption,Aes,Rsa,我必须为一个项目构建一个简单的授权服务器。服务器必须分发AES密钥,以允许其客户端相互通信 使用RSA加密AES密钥时,我遇到了以下错误:“javax.crypto.IllegalBlockSizeException:数据长度不得超过117字节”。 这很奇怪,因为我的AES密钥的长度是128位=16字节 以下是生成错误的代码: private void createAndSendAES() throws NoSuchAlgorithmException, NoSuchPaddingExcepti

我必须为一个项目构建一个简单的授权服务器。服务器必须分发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”
进行加密。然后,只需使用
Cipher.doFinal()
,即可使用RSA算法加密该密钥(请确保完全指定它,例如
“RSA/NONE/OAEPPadding”
“RSA/NONE/PKCS1Padding”

您还可以通过这种方式直接加密生成的数据

另一种方法是简单地增加RSA密钥的大小;1024的RSA密钥大小越来越受到威胁,请尝试使用最小值为2048的密钥大小(允许256-11=245字节的存储)


请注意,您可以使用
key.getEncoded()

从先前创建的AES密钥中检索16个字节。出现错误的原因是保存了整个对象,而不仅仅是构成密钥的16个字节。例如,你会在里面有完整的课程名称,课程的序列号等等

如果您想继续使用
SealedObject
,我建议使用新的随机AES密钥和
“AES/CBC/PKCS5Padding”
进行加密。然后,只需使用
Cipher.doFinal()
,即可使用RSA算法加密该密钥(请确保完全指定它,例如
“RSA/NONE/OAEPPadding”
“RSA/NONE/PKCS1Padding”

您还可以通过这种方式直接加密生成的数据

另一种方法是简单地增加RSA密钥的大小;1024的RSA密钥大小越来越受到威胁,请尝试使用最小值为2048的密钥大小(允许256-11=245字节的存储)


请注意,您可以使用
key.getEncoded()

从先前创建的AES密钥中检索16个字节。出现错误的原因是保存了整个对象,而不仅仅是构成密钥的16个字节。例如,你会在里面有完整的课程名称,课程的序列号等等

如果您想继续使用
SealedObject
,我建议使用新的随机AES密钥和
“AES/CBC/PKCS5Padding”
进行加密。然后,只需使用
Cipher.doFinal()
,即可使用RSA算法加密该密钥(请确保完全指定它,例如
“RSA/NONE/OAEPPadding”
“RSA/NONE/PKCS1Padding”

您还可以通过这种方式直接加密生成的数据

另一种方法是简单地增加RSA密钥的大小;1024的RSA密钥大小越来越受到威胁,请尝试使用最小值为2048的密钥大小(允许256-11=245字节的存储)


请注意,您可以使用
key.getEncoded()

从先前创建的AES密钥中检索16个字节。出现错误的原因是保存了整个对象,而不仅仅是构成密钥的16个字节。例如,你会在里面有完整的课程名称,课程的序列号等等

如果您想继续使用
SealedObject
,我建议使用新的随机AES密钥和
“AES/CBC/PKCS5Padding”
进行加密。然后,只需使用
Cipher.doFinal()
,即可使用RSA算法加密该密钥(请确保完全指定它,例如
“RSA/NONE/OAEPPadding”
“RSA/NONE/PKCS1Padding”

您还可以通过这种方式直接加密生成的数据

另一种方法是简单地增加RSA密钥的大小;1024的RSA密钥大小越来越受到威胁,请尝试使用最小值为2048的密钥大小(允许256-11=245字节的存储)


请注意,您可以使用
key.getEncoded()

从先前创建的AES密钥中检索16个字节。我忘记提到的一个重要细节是我试图编码的对象AESBarkboardKey所属的类:SecretKey。您加密的不是密钥,而是包含密钥的序列化类。好的,谢谢,基本上我有一个128字节+的对象,包含一个128位的密钥。你知道我是否可以将相同的信息存储到更小的对象中吗?我忘记提到的一个重要细节是我试图编码的对象AESBlackboardKey所属的类:SecretKey。你加密的不是密钥,而是包含密钥的序列化类。好的,谢谢,基本上我有一个128字节+的对象,包含一个128位的密钥。你知道我是否可以将相同的信息存储到更小的对象中吗?我忘记提到的一个重要细节是我试图编码的对象AESBlackboardKey所属的类:SecretKey。你加密的不是密钥,而是包含密钥的序列化类。好的,谢谢,基本上我有一个128字节+的对象,包含一个128位的密钥。你知道我是否可以将相同的信息存储到一个更小的对象中吗?我忘了提到的一个重要细节是我试图编码的对象AESBlackboardKey所属的类:SecretKey