Pregunta

Estoy tratando de configurar el cifrado AES de 128 bits, y obtengo una excepción lanzada a mi cifrado.

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

Estoy generando la clave en el lado del cliente usando el siguiente código:

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();

Esta clave se pasa al servidor como encabezado. Está codificado Base64 usando esta función:

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

El servidor saca el encabezado y lo hace

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;
}

Para depurar esto, puse puntos de interrupción después de la generación de claves en el lado del cliente y justo antes del cifre. Innit en el lado del servidor. Según NetBeans, los bytes que componen los SecretKeys son idénticos y tienen 16 bytes de longitud (de hecho, por lo que puedo decir, los objetos son idénticos).

Soy consciente de las cosas ilimitadas de fuerza JCE, pero no tengo la impresión de que lo necesitaba para AES de 128 bits.

Lado del cliente: Versión Java "1.6.0_26"

Lado del servidor: versión Java "1.6.0_20"

¿Algunas ideas?

¿Fue útil?

Solución

He ejecutado su código de diferentes maneras, con: Java 1. {5,6,7} (usando AES); Diferentes códecs Base64 (Codec de Apache Commons, DataTyPeconverted, Base64); diferentes conjuntos de caracteres; Entre diferentes JVM (a través de enchufes) ... en vano. No tengo errores.

Para reducir el problema, ¿puede ejecutar el siguiente código? ambas cosas extremos?

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);
}

(Sé que ya has declarado las versiones JDK que estás usando y cosas, pero no puede doler).

Dado que la clave no se corrompe mientras la transfiere del cliente al servidor (o tal vez en reversa), entonces si:

  • El cliente lanza, pero el servidor no: el error está en el lado del cliente;
  • El cliente no tira, pero el servidor lo hace: el error está en el lado del servidor;
  • El cliente y el servidor lanza o ninguno de ellos, necesita más investigación.

En cualquier caso, si se lanza un error, publique el entero Stack Trace en alguna parte. El error No installed provider supports this key: javax.crypto.spec.SecretKeySpec No nos dice nada (al menos para mí no lo hace, y tampoco podría reproducir este error en particular).

Otros consejos

Este error podría indicar que necesita instalar JCE (extensión de criptografía Java).

Descargue este archivo (o versión más reciente) y copie los jarras en jdk_folder/jre/lib/seguridadhttp://www.oracle.com/technetwork/pt/java/javase/downloads/jce-6 download-429243.html

Este error sucede conmigo, al proporcionar una clave incorrecta para SecretKeySpec constructor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top