如何使用RSA加密AES密钥而不遇到;javax.crypto.IllegalBlockSizeException:数据长度不得超过117字节”;
我必须为一个项目构建一个简单的授权服务器。服务器必须分发AES密钥,以允许其客户端相互通信 使用RSA加密AES密钥时,我遇到了以下错误:“javax.crypto.IllegalBlockSizeException:数据长度不得超过117字节”。 这很奇怪,因为我的AES密钥的长度是128位=16字节 以下是生成错误的代码:如何使用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
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