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

我正在使用静态方法在类中使用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位.

上一篇:在Android上存储登录信息的最佳做法


下一篇:在cakephp中使用回调方法解密和加密