【问题标题】:how to solve javax.crypto. IllegalBlockSizeException without increase the size if key如何解决 javax.crypto。 IllegalBlockSizeException 如果键不增加大小
【发布时间】:2015-04-07 05:13:46
【问题描述】:

在该行捕获的异常

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)

密钥大小由以下公式给出:keyPairGenerator.initialize(4096);

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

【问题讨论】:

    标签: java encryption rsa public-key-encryption


    【解决方案1】:

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

    1. 生成随机 AES 密钥

      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 密钥(对于 AES-256,它是 32 个字节)。

      Cipher cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.WRAP_MODE, rsaKeyPair.getPublic());
      byte[] wrappedKey = cipher.doFinal(keyData);
      
    4. 将 WrappedKey 与密文结合。可以通过将一个附加到另一个来完成,但也可以使用一些二进制格式。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 2011-05-25
      • 2016-03-26
      • 2014-01-24
      • 2011-12-10
      相关资源
      最近更新 更多