gpt4 book ai didi

java - 如何使用 RSA 加密 AES key 而不遇到 "javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes"

转载 作者:行者123 更新时间:2023-12-01 23:24:07 32 4
gpt4 key购买 nike

我必须为一个项目构建一个简单的授权服务器。服务器必须分发 AES key 以允许其客户端相互通信。

使用 RSA 加密 AES key 时,遇到此错误:“javax.crypto.IllegalBlockSizeException:数据不得长于 117 字节”。这很奇怪,因为我的 AES key 的长度是 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 key 的加密如何让我遇到这种错误以及如何避免它吗?

提前致谢!

最佳答案

您收到错误的原因是保存了整个对象,而不仅仅是组成 key 的 16 个字节。所以你会例如其中包含完整的类名、类的序列号等。

如果您想继续使用SealedObject那么我建议使用新的随机 AES key 和 "AES/CBC/PKCS5Padding" 进行加密。然后,您可以使用 RSA 算法加密该 key (请务必完整指定它,例如 "RSA/NONE/OAEPPadding""RSA/NONE/PKCS1Padding" ),只需使用 Cipher.doFinal() 即可。 .

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

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

请注意,您可以使用 key.getEncoded() 从之前创建的 AES key 中检索 16 个字节。 .

关于java - 如何使用 RSA 加密 AES key 而不遇到 "javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20262878/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com