2009-11-19 7 views
23

Ce code donne une erreur de longueur de clé AES non valide. comment puis-je le corriger? (Je veux 128 bits AES clé de chiffrement)Erreur de longueur de clé AES non valide

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

Répondre

21

Utilisez un SecretKeyFactory pour obtenir octets clés d'un password.You peut voir un exemple détaillé here. Notez que vous aurez besoin de spécifier une longueur de clé de 128 bits au lieu de 256 clés bits comme indiqué dans 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 soient un multiple de 16 octets (la taille du bloc AES), cela provoquera une erreur. Utilisez PKCS5Padding comme indiqué dans l'exemple.

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

Essayer d'effectuer une cryptographie sans une compréhension approfondie des concepts évoqués ici (et beaucoup plus) est susceptible d'aboutir à un système non sécurisé.

10

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

Une façon courante de procéder consiste à hacher votre mot de passe (par exemple, via SHA) et à 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" des deux utilisateurs ne sont pas identiques même si leurs mots de passe sont identiques. Si vous êtes vraiment intéressé par ce genre de choses, le travail séminal est Applied Cryptography by Bruce Schneier.

Pour plus de détails de mise en œuvre pratique, see

1

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

Donc psuedocode, vous essayez quelque chose comme ceci:

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

mais la clé est trop courte - il doit être quelque chose comme, disons 31 caractères. Donc, vérifiez votre valeur de clé -> il est probablement stocké quelque part de façon incorrecte.

-1

Utilisez une clé Chaîne de valeur avec 16 octets pour un chiffrement lisse, par ex. La clé "thebestsecretkey" fonctionnera sur base64