gpt4 book ai didi

java - 如何解决 javax.crypto. IllegalBlockSizeException 不增加大小 if key

转载 作者:行者123 更新时间:2023-11-30 03:29:03 25 4
gpt4 key购买 nike

在线捕获异常

encryptedData = cipher.doFinal(data);

javax.crypto.IllegalBlockSizeException: Data must not be longer than 501 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)

key 大小由以下方式给出:keyPairGenerator.initialize(4096);

如何在不增加 key 大小的情况下解决这个问题?

最佳答案

使用非对称加密时,无法加密比 key 减去填充长度更长的数据。由于它是 11 个字节,我可以断定您使用 PKCS#1 填充。您可以做的是尝试压缩数据,但根据数据长度和性质,它很容易失败。另一种选择是将对称分组密码(对数据大小没有限制)和非对称加密结合起来:

  1. 生成随机 AES key

    byte[] keyData = new byte[32];
    SecureRandom random = new SecureRandom();
    random.nextBytes(keyData);
  2. 使用 AES 加密数据。

    // zero filled input vector
    byte[] ivData = new byte[32];
    IvParameterSpec iv = new IvParameterSpec(ivData);
    SecretKeySpec keySpec = new SecretKeySpec(keyData, "AES");
    Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
    aes.init(Cipher.ENCRYPT_MODE, keySpec, iv);
    byte[] cipherText = aes.doFinal(data);
  3. 使用 RSA 私钥加密 AES key (对于 AES-256,为 32 字节)。

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.WRAP_MODE, rsaKeyPair.getPublic());
    byte[] wrappedKey = cipher.doFinal(keyData);
  4. 将wrappedKey 与cipherText 组合。只需将一个附加到另一个即可完成,但也可以使用某种二进制格式。

关于java - 如何解决 javax.crypto. IllegalBlockSizeException 不增加大小 if key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29484222/

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