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

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,

我正在使用静态方法编写一个类,使用javax.crypto对消息进行加密和解密。我有两个静态方法,它们使用ecipher和dcipher来完成它们被支持的任务,我需要初始化一些变量(它们也是静态的)。但当我尝试使用它时,我得到了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);
        }
    }

从SecretKeySpec文档:

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

我猜您的字节与AES的有效密钥不对应。 您可以找到一个如何生成它的示例。 苏尔特

更新:另见

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

AES-256(和AES-192)要求为JRE安装无限强度权限策略文件(上次下载时的文件之一)。在尝试使用192位或256位密钥时,如在类中,没有此支持将导致InvalidKeyException


中记录了无限制强度的AES允许的最大密钥大小,恰好是128位。

您安装了无限制权限加密策略文件吗?JCE更新后您做了什么?我重新启动了eclipse,但仍然有相同的功能。