线程"main"java.security.InvalidKeyException中的异常:以下代码的密钥大小非法
密钥的字符长度为44。我试过用字符长度24来加密。请帮助解决此问题。
public static void main(String args[]) throws Exception {
String plainText = "Hello world!";
String encryptionKeyBase64 = "DWIzFkO22qfVMgx2fIsxOXnwz10pRuZfFJBvf4RS3eY=";
System.out.println(encryptionKeyBase64.length());
String ivBase64 = "AcynMwikMkW4c7+mHtwtfw==";
EncDec encDec = new EncDec();
String cipherText = encDec.encrypt(plainText, encryptionKeyBase64, ivBase64);
}
public String encrypt(String plainText, String keyBase64, String ivBase64) throws Exception
{
byte[] plainTextArray = plainText.getBytes(StandardCharsets.UTF_8);
byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);
SecretKeySpec secretKey = new SecretKeySpec(keyArray, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
return new String(DatatypeConverter.printBase64Binary(cipher.doFinal(plainTextArray)));
}
public String decrypt(String messageBase64, String keyBase64, String ivBase64) throws Exception {
byte[] messageArray = DatatypeConverter.parseBase64Binary(messageBase64);
byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);
SecretKey secretKey = new SecretKeySpec(keyArray, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
return new String(cipher.doFinal(messageArray));
}
}```
使用"AES"作为加密方案时,SecretKeySpec输入中的密钥长度必须为16、24或32字节。
因此,您应该检查byte[]keyArray的长度,而不是String"encryptionKeyBase64"的长度,并确保其长度为16/24/32字节。
您可以添加行
System.out.println("keyArray.length: " +
DatatypeConverter.parseBase64Binary(encryptionKeyBase64).length);
在加密/解密方法中使用它之前。
Btw初始化向量"iv"的长度必须为16字节(固定,与密钥长度无关(。你可以用很容易地检查
System.out.println("iv.length: " + DatatypeConverter.parseBase64Binary(ivBase64).length);