(Java.sécurité.InvalidKeyException) Aucun IV défini lorsqu'une erreur attendue au chiffrement.init(Cipher.DÉCRYPTER MODE, clé)


SecretKey key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] ciphertext = cipher.doFinal(cleartext);

return bytes2String(ciphertext);

Je reçois java.sécurité.InvalidKeyException c'est-à-dire pas d'IV défini lorsqu'une erreur attendue au chiffrement.init(Cipher.DECRYPT_MODE, clé).cleartext est un tableau d'octets résultant du décodage base64 d'une chaîne.Ce qui me manque ici ?

Author: Sourav Bebarta, 2016-09-10

1 answers

Je ne suis pas expert en la matière mais, vous spécifiez CBC mode qui nécessite un vecteur d'initialisation (IV), qui pour AES est un paramètre de 16 octets.

private final static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
private static final IvParameterSpec ivspec = new IvParameterSpec(iv);

Ensuite, lors de l'appel de la méthode init(), fournissez le IV lors du chiffrement et du déchiffrement.

cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);

Vous ne devez jamais utiliser l'approche ci-dessus et laisser Java générer l'IV aléatoire pour vous ou fournir une implémentation SecureRandom.

Le point dans l'utilisation d'un aléatoire, IV est de s'assurer que le même texte brut ne crypte pas à générez deux fois le même texte chiffré. C'est le seul but de la IV.

Stockez le IV au début du texte crypté et pendant le déchiffrement, vous savez que les n chiffres de départ sont le IV.

Lorsqu'il ne fournit pas IV, il génère par défaut un IV aléatoire. Source

Si ce chiffrement (y compris son feedback sous-jacent ou son schéma de remplissage) nécessite des octets aléatoires( par exemple, pour la génération de paramètres), il les obtiendra en utilisant SecureRandom implémentation du fournisseur installé de la plus haute priorité en tant que source de caractère aléatoire. (Si aucun des fournisseurs installés ne fournit une implémentation de SecureRandom, une source aléatoire fournie par le système sera utilisée.)

 2
Author: GreyGoose, 2016-09-10 08:33:59