Question

Je suis en train de mettre en place le cryptage AES 128 bits, et je me fais une exception levée sur mon Cipher.init:

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

Je suis générer la clé du côté client en utilisant le code suivant:

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

Cette clé est alors transmis au serveur en en-tête. il est base64 codé en utilisant cette fonction:

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

Le serveur tire l'en-tête et fait

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

Pour déboguer, je mets des points d'arrêt après la fois la génération de clés du côté client, et juste avant le cipher.init du côté du serveur. Selon Netbeans, les octets qui composent les SecretKeys sont identiques et 16 octets de longueur (En fait, pour autant que je peux dire, les objets sont identiques).

Je suis au courant des choses de force illimitée JCE, mais je ne suis pas l'impression que j'avais besoin de 128 bits AES.

Côté client: java version "1.6.0_26"

Side serveur: java version "1.6.0_20"

Des idées?

Était-ce utile?

La solution

J'ai exécuté votre code de différentes manières, avec: Java 1. {5,6,7} (en utilisant AES); différents codecs base64 (Apache Commons Codec, DatatypeConverted, base64); différents jeux de caractères; entre les différents JVMs (par prises) ... en vain. Je suis pas d'erreur.

Pour limiter le problème, vous pouvez exécuter le code suivant sur à la fois extrémités?

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

(je sais que vous avez déjà dit les versions JDK que vous utilisez et tout ça, mais il ne peut pas nuire.)

Étant donné que la clé ne soit pas corrompu pendant que vous transférez du client vers le serveur (ou peut-être dans le sens inverse), alors si:

  • le client lance, mais le serveur l'erreur-Indifférent Fume est sur le côté client;
  • le client ne jette pas, mais le serveur ne l'erreur-est sur le côté serveur;
  • le client et le serveur à la fois jette ou aucun d'eux-doit être approfondie.

Dans tous les cas, si une erreur est renvoyée, s'il vous plaît poster tout quelque part trace de la pile. Le No installed provider supports this key: javax.crypto.spec.SecretKeySpec d'erreur ne nous dit rien (au moins pour moi, il ne fonctionne pas et je ne pouvais pas reproduire cette erreur particulière soit).

Autres conseils

Cette erreur pourrait indiquer que vous devez installer JCE (Java Cryptography Extension).

Télécharger ce fichier (ou version plus récente) et de copier des bocaux à JDK_FOLDER / jre / lib / security http://www.oracle.com /technetwork/pt/java/javase/downloads/jce-6-download-429243.html

Cette erreur se produit avec moi, lors de la fourniture d'une clé incorrecte au constructeur SecretKeySpec.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top