当前位置: 首页 > 知识库问答 >
问题:

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

司徒宏远
2023-03-14

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

徐秋月
2023-03-14

你得到错误的原因是整个对象被保存了,而不仅仅是组成密钥的16个字节。所以你会有完整的类名,类的序列号等等。

如果您想继续使用SealedObject,那么我建议使用新的随机AES密钥和"AES/CBC/PKCS5Padd"进行加密。然后,您可以使用RSA算法加密该密钥(请务必完全指定它,例如"RSA/NONE/OAEPPadd""RSA/NONE/PKCS1Padd"),只需使用Cipher.do最终()

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

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

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

 类似资料:
  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

  • 我使用mysql aes加密和解密如下: 我读到AES支持128 192和256。我假设默认值是128是正确的吗?因此,鉴于上述查询没有定义密钥长度,它会以默认密钥长度加密和解密吗? 如果是这样,在上面的查询中指定密钥长度会更好吗?因为例如:假设我使用默认值128加密和存储数据,但后来设置更改,256变为默认值,那么这意味着它将无法解密数据,对吗?有没有办法在上面的查询中定义密钥长度? 另外,我用

  • 我正在学习ssl通信的基础知识,尤其是AES加密。我读了OpenSSL代码,看到了一个名为< code>userkey的指针。 在文件"aes_core. c"中 > 从何而来?它是如何生成的? 我想知道不同版本AES的的实际大小。 256 位版本为 256 / 8 = 32,192 为 24,128 为 16?我有点迷茫。 如果长度是可变的,那么我应该如何为那些符合长度要求的输入创建一个安全的输

  • 这是我的密码 抱歉,如果我的代码一团糟。

  • 我创建了以下方法 用于加密 我有很长的xml字符串,使用这两种方法如下 但它给了我数据不得超过256字节时使用rsa 证书被客户端切分,表示签名算法sha256RS。

  • 我在.NET Core2.0中创建了一个RSA加密/解密服务,目前我使用密钥库机密来保存RSA密钥。但据我所知,我可以用Key Vault密钥实现这一点,但目前还不能实现,因为KV Keys不支持2048长RSA密钥的加密/解密...这真让我摸不着头脑。 那么,我是否可以使用带有Azure Key Vault密钥的2048密钥来实现RSA加密/解密呢?