Java:密码包(加密和解密)。无效密钥错误
我正在使用静态方法编写一个类,使用javax.crypto对消息进行加密和解密。我有两个静态方法,它们使用ecipher和dcipher来完成它们被支持的任务,我需要初始化一些变量(它们也是静态的)。但当我尝试使用它时,我得到了InvalidKeyException,其中包含我给ecipher.init(…)的参数。我不知道为什么。代码如下:Java:密码包(加密和解密)。无效密钥错误,java,exception,static,encryption,Java,Exception,Static,Encryption,我正在使用静态方法编写一个类,使用javax.crypto对消息进行加密和解密。我有两个静态方法,它们使用ecipher和dcipher来完成它们被支持的任务,我需要初始化一些变量(它们也是静态的)。但当我尝试使用它时,我得到了InvalidKeyException,其中包含我给ecipher.init(…)的参数。我不知道为什么。代码如下: private static byte[] raw = {-31, 17, 7, -34, 59, -61, -60, -16,
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);
}
}
从SecretKeySpec文档: 此构造函数不检查 给定的字节确实指定了一个秘密 指定算法的密钥。对于 例如,如果算法是DES,则 构造函数不检查键是否为8 字节长,也不检查 用于弱键或半弱键。整齐 对于要执行的检查,需要 特定于算法的密钥规范 类(在本例中为DESKeySpec) 应该使用 我猜您的字节与AES的有效密钥不对应。 您可以找到一个如何生成它的示例。 苏尔特 更新:另见 更新2:正如另一个答案所指出的,您的特定raw肯定是无效的,因为您的系统不支持AES 256。请将其缩短为16字节(128位),然后重试。AES-256(和AES-192)要求为JRE安装无限强度权限策略文件(上次下载时的文件之一)。在尝试使用192位或256位密钥时,如在类中,没有此支持将导致InvalidKeyException
中记录了无限制强度的AES允许的最大密钥大小,恰好是128位。您安装了无限制权限加密策略文件吗?JCE更新后您做了什么?我重新启动了eclipse,但仍然有相同的功能。