Java AES: ни один из установленных провайдеров не поддерживает этот ключ: javax.crypto.spec.SecretKeySpec - PullRequest
11 голосов
/ 03 декабря 2011

Я пытаюсь настроить 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, байты, составляющие SecretKeys, идентичны и имеют длину 16 байтов (фактически, насколько я могу судить, объекты идентичны).

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

Клиентская часть: Java-версия "1.6.0_26"

Серверная часть: Java-версия "1.6.0_20"

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 17 декабря 2011

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

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

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 нам ничего не говорит (по крайней мере, для меня это не так, и я не мог воспроизвести эту конкретную ошибку).

6 голосов
/ 20 августа 2015

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

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

1 голос
/ 19 апреля 2018

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

...