Erreur de déchiffrement: «aucun iv défini quand on s’y attendait»

Je suis presque nouveau au cryptage.

J’essaie de déchiffrer un tableau d’octets et, lorsque je fournis le vecteur d’initialisation, j’obtiens une exception: InvalidAlgorithmParameterException (aucune iv définie quand on en attend une).

Voici mon code ( iv est un tableau de 16 octets qui n’est pas nul et a les valeurs utilisées lors du cryptage):

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, encriptionKey,new IvParameterSpec(iv)); 

Si je ne spécifie pas le vecteur d’initialisation, le chiffrement est initialisé correctement:

 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, encriptionKey); 

En essayant de trouver une réponse, j’ai trouvé une implémentation de JCEStreamCipher ( ici ) qui ne correspond peut-être pas à la version que j’utilise mais qui contient du code qui me fait mal, mais je ne la comprends pas correctement.

Voici le code:

  if ((ivLength != 0) && !(param instanceof ParametersWithIV)) { SecureRandom ivRandom = random; if (ivRandom == null) { ivRandom = new SecureRandom(); } if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) { byte[] iv = new byte[ivLength]; ivRandom.nextBytes(iv); param = new ParametersWithIV(param, iv); ivParam = (ParametersWithIV)param; } else { throw new InvalidAlgorithmParameterException("no IV set when one expected"); } } 

On dirait que je ne peux pas fournir de IV lors du déchiffrement, mais cela n’a pas beaucoup de sens pour moi.

Toute aide est la bienvenue.

merci beaucoup, richard.

Résolu

J’utilisais une mauvaise clé secrète, pas celle que vous pouvez créer pour AES.

Auparavant j’avais:

 KeySpec spec = new PBEKeySpec(password.toCharArray(), encryptionKeySalt, 12345,256); SecretKey encriptionKey = factory.generateSecret(spec); 

ce qui crée une JCEPBEKey.

Je manquais :

 Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 

qui crée une clé appropriée pour AES.