Java AES: No installed provider supports this key: javax.crypto.spec.SecretKeySpec

Я пытаюсь установить 128-битное шифрование AES, и получаю исключение, брошенное на моем Cipher.init:

Ни один установленный провайдер не поддерживает этот ключ: javax.crypto.spec.SecretKeySpec

Я генерирую ключ на стороне клиента, используя следующий код:

private KeyGenerator kgen;
try {
        kgen = KeyGenerator.getInstance("AES");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    kgen.init(128);
}
SecretKey skey = kgen.generateKey();

Этот ключ затем передается на сервер в качестве заголовка. Он кодируется в Base64 с помощью этой функции:

public String secretKeyToString(SecretKey s) {
        Base64 b64 = new Base64();
        byte[] bytes = b64.encodeBase64(s.getEncoded());
        return new String(bytes);
}

Сервер извлекает заголовок и делает

protected static byte[] encrypt(byte[] data, String base64encodedKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("AES");
    } catch (NoSuchAlgorithmException ex) {
        //log error
    } catch (NoSuchPaddingException ex) {
        //log error
    }
    SecretKey key = b64EncodedStringToSecretKey(base64encodedKey);
    cipher.init(Cipher.ENCRYPT_MODE, key); //THIS IS WHERE IT FAILS
    data = cipher.doFinal(data);
    return data;
}
private static SecretKey b64EncodedStringToSecretKey(String base64encodedKey) {
    SecretKey key = null;

    try {
        byte[] temp = Base64.decodeBase64(base64encodedKey.getBytes());
        key = new SecretKeySpec(temp, SYMMETRIC_ALGORITHM);
    } catch (Exception e) {
        // Do nothing
    }

    return key;
}

Чтобы отладить это, я поставил точки останова после генерации ключа на стороне клиента и непосредственно перед cipher.init на стороне сервера. Согласно Netbeans, байты, составляющие SecretKeys, идентичны и имеют длину 16 байт (на самом деле, насколько я могу судить, объекты идентичны).

Я знаю о неограниченной прочности JCE, но у меня нет впечатления, что она нужна для 128-битного AES.

Клиентская сторона: java версии "1.6.0_26"

Серверная сторона: java версии "1.6.0_20"

Есть идеи?

12
задан Cody S 2 December 2011 в 21:34
поделиться