Java AES: aucun fournisseur installé ne prend en charge cette clé: javax.crypto.spec.SecretKeySpec

J’essaie de configurer le cryptage AES 128 bits et une exception est générée sur mon Cipher.init:

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

Je génère la clé côté client à l’aide du 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 ensuite transmise au serveur en tant qu’en-tête. il est encodé en Base64 en utilisant cette fonction:

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

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

 protected static byte[] encrypt(byte[] data, Ssortingng base64encodedKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Cipher cipher; try { cipher = Cipher.getInstance("AES"); } catch (NoSuchAlgorithmException ex) { //log error } catch (NoSuchPaddingException ex) { //log error } SecretKey key = b64EncodedSsortingngToSecretKey(base64encodedKey); cipher.init(Cipher.ENCRYPT_MODE, key); //THIS IS WHERE IT FAILS data = cipher.doFinal(data); return data; } private static SecretKey b64EncodedSsortingngToSecretKey(Ssortingng 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 ceci, je mets des points d’arrêt après la génération de clé côté client et juste avant le fichier cipher.init côté serveur. Selon Netbeans, les octets qui constituent les SecretKeys sont identiques et ont une longueur de 16 octets (en fait, pour autant que je sache, les objects sont identiques).

Je suis conscient de la force illimitée de JCE, mais je n’ai pas l’impression d’en avoir besoin pour le format AES 128 bits.

Côté client: version java “1.6.0_26”

Côté serveur: version java “1.6.0_20”

Des idées?

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 différentes machines virtuelles (via des sockets)… en vain. Je n’ai aucune erreur.

Pour réduire le problème, pouvez-vous exécuter le code suivant aux deux extrémités?

 static { System.out.println(System.getProperty("java.version")); for (Provider provider : Security.getProviders()) System.out.println(provider); } public static void main(Ssortingng[] 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à indiqué les versions de JDK que vous utilisez et d’autres choses, mais cela ne fait pas de mal.)

Étant donné que la clé n’est pas corrompue pendant le transfert du client au serveur (ou peut-être à l’envers), alors si:

  • le client jette, mais le serveur ne le fait pas – l’erreur est du côté du client;
  • le client ne jette pas, mais le serveur fait, l’erreur est du côté du serveur;
  • le client et le serveur lancent tous les deux ou aucun des deux – nécessitent des investigations supplémentaires

Dans tous les cas, si une erreur est générée, veuillez publier la trace de stack entière quelque part. L’erreur No installed provider supports this key: javax.crypto.spec.SecretKeySpec ne nous dit rien (du moins pour moi ce n’est pas le cas, et je ne pouvais pas reproduire cette erreur particulière non plus).

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

Téléchargez ce fichier (ou une version plus récente) et copiez les fichiers jar dans 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 lorsque vous fournissez une clé incorrecte au constructeur SecretKeySpec .