Java:密码包(加密和解密)。 无效的密钥错误

我正在使用静态方法创建一个类来使用javax.crypto加密和解密消息。 我有2个静态方法,使用ecipher和dcipher来做他们所要做的事情,我需要初始化一些变量(也是静态的)。 但是当我尝试使用它时,我得到了带有ecipher.init(…)参数的InvalidKeyException。 我找不到原因。 这是代码:

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。

“ JCA参考指南(适用于Java 6)”中介绍了AES无最大允许密钥大小,且无限制的强度,这恰好是128位。

来自SecretKeySpec doc:

此构造函数不检查给定的字节是否确实指定了指定算法的密钥。 例如,如果算法是DES,则此构造函数不检查密钥是否为8字节长,也不检查弱密钥或半弱密钥。 为了执行这些检查,应使用特定于算法的密钥规范类(在本例中为:DESKeySpec)。

我猜你的字节与AES的有效密钥不对应。 在这里,您可以找到有关如何生成它的示例。 Suerte。

更新:另见此处 。

更新2:正如另一个答案所指出的,您的特定原始肯定是无效的,因为您的系统不支持AES 256.将其缩短为16字节(128位)并再试一次。