解决"AES-GCM解密错误iaik.cms.CMSException:无法解密加密的内容加密密钥:无效的填充"的问题通常涉及到填充错误或密钥不匹配的问题。下面是一个可能的解决方案,包含代码示例:
import javax.crypto.*;
import javax.crypto.spec.*;
public class AESGCMExample {
public static void main(String[] args) throws Exception {
// 设置密钥
byte[] keyData = "0123456789abcdef".getBytes("UTF-8");
SecretKeySpec key = new SecretKeySpec(keyData, "AES");
// 设置初始化向量
byte[] ivData = "abcdefghijklmnop".getBytes("UTF-8");
IvParameterSpec iv = new IvParameterSpec(ivData);
// 加密
String plaintext = "Hello, world!";
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decrypted = cipher.doFinal(ciphertext);
String decryptedText = new String(decrypted, "UTF-8");
System.out.println(decryptedText);
}
}
确保加密和解密使用相同的填充模式。在上面的代码示例中,我们使用了"NoPadding"填充模式。确保在加密和解密代码中使用相同的填充模式。
如果仍然遇到解密错误,您可以尝试更换解密算法。AES-GCM是一种高级加密标准,但如果不适用于您的情况,您可以尝试其他加密算法,如AES-CBC。
import javax.crypto.*;
import javax.crypto.spec.*;
public class AESCBCExample {
public static void main(String[] args) throws Exception {
// 设置密钥
byte[] keyData = "0123456789abcdef".getBytes("UTF-8");
SecretKeySpec key = new SecretKeySpec(keyData, "AES");
// 设置初始化向量
byte[] ivData = "abcdefghijklmnop".getBytes("UTF-8");
IvParameterSpec iv = new IvParameterSpec(ivData);
// 加密
String plaintext = "Hello, world!";
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decrypted = cipher.doFinal(ciphertext);
String decryptedText = new String(decrypted, "UTF-8");
System.out.println(decryptedText);
}
}
通过检查密钥、参数、填充模式以及使用合适的解密算法,您应该能够解决"AES-GCM解密错误iaik.cms.CMSException:无法解密加密的内容加密密钥:无效的填充"的问题。