如何解决javax.crypto。 IllegalBlockSizeException 不增加大小 if key
how to solve javax.crypto. IllegalBlockSizeException without increase the size if key
在线捕获异常
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大小的情况下解决这个问题?
使用非对称加密,无法加密比密钥减去填充更长的数据。因为它对你来说是 11 个字节,所以我可以断定你使用的是 PKCS#1 填充。您可以做的是尝试压缩数据,但根据数据长度和性质,它很容易失败。另一种选择是结合对称块密码(对数据大小没有限制)和非对称加密:
生成随机 AES 密钥
byte[] keyData = new byte[32];
SecureRandom random = new SecureRandom();
random.nextBytes(keyData);
使用 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);
使用 RSA 私钥加密 AES 密钥(AES-256 为 32 字节)。
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, rsaKeyPair.getPublic());
byte[] wrappedKey = cipher.doFinal(keyData);
结合 wrappedKey 和 cipherText。可以通过将一个附加到另一个来完成,但也可以使用一些二进制格式。
在线捕获异常
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大小的情况下解决这个问题?
使用非对称加密,无法加密比密钥减去填充更长的数据。因为它对你来说是 11 个字节,所以我可以断定你使用的是 PKCS#1 填充。您可以做的是尝试压缩数据,但根据数据长度和性质,它很容易失败。另一种选择是结合对称块密码(对数据大小没有限制)和非对称加密:
生成随机 AES 密钥
byte[] keyData = new byte[32]; SecureRandom random = new SecureRandom(); random.nextBytes(keyData);
使用 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);
使用 RSA 私钥加密 AES 密钥(AES-256 为 32 字节)。
Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.WRAP_MODE, rsaKeyPair.getPublic()); byte[] wrappedKey = cipher.doFinal(keyData);
结合 wrappedKey 和 cipherText。可以通过将一个附加到另一个来完成,但也可以使用一些二进制格式。