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

StackOverflow https://stackoverflow.com/questions/8362262

Вопрос

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

No installed provider supports this key: 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, байты, составляющие секретные ключи, идентичны и имеют длину 16 байт (на самом деле, насколько я могу судить, объекты идентичны).

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

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

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

Есть какие-нибудь идеи?

Это было полезно?

Решение

Я запускал ваш код по-разному, с:Java 1.{5,6,7} (с использованием AES);различные кодеки Base64 (Apache Commons Codec, DatatypeConverted, Base64);разные наборы символов;между разными JVM (через сокеты) ... безрезультатно.У меня нет ошибок.

Чтобы сузить круг проблем, можете ли вы запустить следующий код на и то , и другое заканчивается?

static {
  System.out.println(System.getProperty("java.version"));
  for (Provider provider : Security.getProviders())
    System.out.println(provider);
}

public static void main(String[] args) throws Exception {
  KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  keyGenerator.init(128);
  SecretKey secretKey = keyGenerator.generateKey();
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.ENCRYPT_MODE, secretKey);
}

(Я знаю, что вы уже указали версии JDK, которые используете, и прочее, но это не повредит.)

Учитывая, что ключ не повреждается при передаче его с клиента на сервер (или, возможно, в обратном порядке), то если:

  • клиент выдает ошибку, но сервер этого не делает — ошибка на стороне клиента;
  • клиент не выдает, но сервер выдает — ошибка на стороне сервера;
  • клиент и сервер оба выбрасывают или ни один из них — нуждается в дальнейшем исследовании.

В любом случае, если будет выдана ошибка, пожалуйста, опубликуйте весь где-то есть трассировка стека.Ошибка No installed provider supports this key: javax.crypto.spec.SecretKeySpec нам ничего не говорит (по крайней мере, для меня это не так, и я также не смог воспроизвести эту конкретную ошибку).

Другие советы

Эта ошибка может указывать на то, что вам необходимо установить JCE (расширение Java Cryptography Extension).

Загрузите этот файл (или более новую версию) и скопируйте jars в JDK_FOLDER/jre/lib/security http://www.oracle.com/technetwork/pt/java/javase/downloads/jce-6-download-429243.html

Эта ошибка возникает у меня при предоставлении неправильного ключа для SecretKeySpec конструктор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top