如何解决javax.crypto。 IllegalBlockSizeException,如果没有增加大小的密钥

时间:2015-04-07 05:13:47

标签: java encryption rsa public-key-encryption

在行

处发现异常
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);

给出

如何在不增加密钥大小的情况下解决此问题?

1 个答案:

答案 0 :(得分:2)

使用非对称加密,无法加密数据的时间长于密钥减去填充。由于它是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与cipherText结合使用。可以只使用一个到另一个来完成,但也可以使用一些二进制格式。