我正在使用静态方法在类中使用javax.crypto加密和解密消息.我有2个使用密码和密码的静态方法,以便执行应做的事情,我需要初始化一些变量(也是静态的).但是,当我尝试使用它时,我得到的InvalidKeyException与我提供给ecipher.init(…)的参数.我找不到原因.这是代码:
private static byte[] raw = {-31, 17, 7, -34, 59, -61, -60, -16,
26, 87, -35, 114, 0, -53, 99, -116,
-82, -122, 68, 47, -3, -17, -21, -82,
-50, 126, 119, -106, -119, -5, 109, 98};
private static SecretKeySpec skeySpec;
private static Cipher ecipher;
private static Cipher dcipher;
static {
try {
skeySpec = new SecretKeySpec(raw, "AES");
// Instantiate the cipher
ecipher = Cipher.getInstance("AES");
dcipher = Cipher.getInstance("AES");
ecipher.init(Cipher.ENCRYPT_MODE, skeySpec);
dcipher.init(Cipher.DECRYPT_MODE, skeySpec);
} catch (NoSuchAlgorithmException e) {
throw new UnhandledException("No existe el algoritmo deseado", e);
} catch (NoSuchPaddingException e) {
throw new UnhandledException("No existe el padding deseado", e);
} catch (InvalidKeyException e) {
throw new UnhandledException("Clave invalida", e);
}
}
解决方法:
AES-256(和AES-192)要求为JRE安装无限强度管辖策略文件(最后一次下载为http://java.sun.com/javase/downloads/index.jsp).如您在类中那样,如果没有这种支持,则会在尝试使用192位或256位密钥时导致InvalidKeyException.
没有无限强度的AES允许的最大密钥大小记录在JCA Reference Guide for Java 6中,恰好是128位.