web-dev-qa-db-fra.com

erreur de longueur de clé AES non valide

ce code donne une erreur de longueur de clé AES non valide. comment puis-je le corriger? (Je veux un cryptage AES à clé 128 bits)

package org.temp2.cod1;
import Java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import Java.io.*;

public class Code1 {

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    String s = "9882623867";
    byte[] plaintext = s.getBytes("UTF-16");
    String s2 = "supernova";
    byte[] key = s2.getBytes("UTF-16");
    Cipher c = Cipher.getInstance("AES");
    SecretKeySpec k =  new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    byte[] encryptedData = c.doFinal(plaintext);
    System.out.println(encryptedData);
}
}

toute aide appréciée

25
silverkid

Utilisez un SecretKeyFactory pour dériver les octets de clé d'un mot de passe. Vous pouvez voir un exemple détaillé ici. Notez que vous devrez spécifier une longueur de clé de 128 bits au lieu de 256 bits comme le montre cet exemple.

Le prochain problème que vous rencontrerez est que vous n'avez pas spécifié de schéma de remplissage. À moins que vos messages ne soient un multiple de 16 octets (la taille du bloc AES), cela générera une erreur. Utilisez PKCS5Padding comme indiqué dans l'exemple.

L'utilisation du mode CBC sur le chiffrement nécessitera un nouveau vecteur d'initialisation à choisir pour chaque message. Ce IV unique doit être envoyé avec le message crypté au destinataire.

Essayer d'effectuer la cryptographie sans une compréhension approfondie des concepts soulevés ici (et bien plus) est susceptible de conduire à un système non sécurisé.

22
erickson

Vous ne pouvez généralement pas utiliser de longueur de clé arbitraire (comme vous le faites ici avec "supernova") pour un chiffrement de bloc comme AES. Vous devez utiliser une longueur de clé prise en charge (128, 192, 256, etc.) appropriée pour l'algorithme de votre choix.

Une façon courante de le faire est de hacher votre phrase secrète (par exemple, via SHA) et d'extraire les N premiers octets. C'est mieux de toute façon, car cela vous permet de "saler" votre mot de passe avec une valeur d'initialisation telle que les "clés" de deux utilisateurs ne soient pas identiques, même si leurs mots de passe sont les mêmes. Si vous êtes vraiment intéressé par ce genre de choses, le travail séminal est Applied Cryptography by Bruce Schneier .

Pour les détails pratiques de mise en œuvre, voir

10
DarkSquid

Vous pouvez obtenir cette erreur lorsque la clé que vous essayez d'utiliser n'est pas de la bonne longueur.

Donc, dans psuedocode, vous essayez quelque chose comme ceci:

String key = "123";
SecretKeySpec k =  new SecretKeySpec(key, "AES");

mais la clé est trop courte - elle doit ressembler à, disons, 31 caractères.

Vérifiez donc la valeur de votre clé -> elle est probablement stockée de manière incorrecte.

1
Brad Parks