AES解密,有时会遇到key长度不够16位的场景,如何处理,如下以AES-128-ECB解密模式为例进行展示。
public class Test {
public static void main(String[] args) throws Exception {
String str="htNbZOHaXvMimfeSoK5jQg==";//AES-128-ECB加密后的密文
String decStr=decrypt(str,"123");
System.out.println(decStr);
}
/* *
* @Author na_tion
* @Description AES解密函数
* 也可以使用其他网上常见的函数
* @Date 10:53 上午 2020/04/10
* @Param [content, passwd]
* @return java.lang.String
**/
public static String decrypt(String content, String passwd) {
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES");
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = new BASE64Decoder().decodeBuffer(content);
return new String(cipher.doFinal(result)); // 解密
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
如上代码,会报如下错误(提示key长度为3字节,不够16字节)
java.security.InvalidKeyException: Invalid AES key length: 3 bytes
at com.sun.crypto.provider.AESCrypt.init(AESCrypt.java:87)
at com.sun.crypto.provider.ElectronicCodeBook.init(ElectronicCodeBook.java:94)
at com.sun.crypto.provider.CipherCore.init(CipherCore.java:591)
at com.sun.crypto.provider.CipherCore.init(CipherCore.java:467)
at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:313)
at javax.crypto.Cipher.implInit(Cipher.java:801)
at javax.crypto.Cipher.chooseProvider(Cipher.java:863)
at javax.crypto.Cipher.init(Cipher.java:1248)
at javax.crypto.Cipher.init(Cipher.java:1185)
处理方法:
用\0补齐不够的位数,代码示例如下
public static void main(String[] args) throws Exception {
String str="htNbZOHaXvMimfeSoK5jQg==";//AES-128-ECB加密后的密文
//String decStr=decrypt(str,"123");
String decStr=decrypt(str,"123\0\0\0\0\0\0\0\0\0\0\0\0\0");//用\0补齐不够的位数
System.out.println(decStr);
}