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

时间:2010-05-06 21:49:33

标签: java exception static encryption

我正在使用静态方法创建一个类来使用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);
        }
    }

2 个答案:

答案 0 :(得分:4)

AES-256(和AES-192)要求为JRE安装无限强度管辖权政策文件(最后一次下载http://java.sun.com/javase/downloads/index.jsp)。在您的类中尝试使用192或256位密钥时,没有此支持将导致InvalidKeyException。

JCA Reference Guide for Java 6中记录了AES没有无限强度的最大允许密钥大小,这恰好是128位。

答案 1 :(得分:1)

来自SecretKeySpec doc:

  

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

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

更新:另请参阅here

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