Le Chiffrement AES Java Invalide la longueur de la Clé
Je suis en train de créer une méthode de cryptage AES, mais pour une raison que je reçois
java.security.InvalidKeyException: Key length not 128/192/256 bits
Voici le code:
public static SecretKey getSecretKey(char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException{
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
//NOTE: last argument is the key length, and it is 256
KeySpec spec = new PBEKeySpec(password, salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
return(secret);
}
public static byte[] encrypt(char[] password, byte[] salt, String text) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{
SecretKey secret = getSecretKey(password, salt);
Cipher cipher = Cipher.getInstance("AES");
//NOTE: This is where the Exception is being thrown
cipher.init(Cipher.ENCRYPT_MODE, secret);
byte[] ciphertext = cipher.doFinal(text.getBytes("UTF-8"));
return(ciphertext);
}
N'importe qui peut voir ce que je fais de mal? Je pense qu'il peut avoir quelque chose à voir avec la SecretKeyFactory algorithme, mais c'est le seul que je peux trouver est pris en charge sur le système final je suis encontre du développement. Toute aide serait appréciée. Merci.
Pouvez vous s'il vous plaît coller l'exception?
Il y a une réponse dans un précédent post ce lien. Espérons que cette aide!
donc, il semble que le java exemple ne prend pas en charge ce dont j'ai besoin: 'java.de sécurité.InvalidKeyException avec le message "Illégal taille de la clé ou les paramètres par défaut" '
Aussi, est-il une limitation sur le Chiffrement, ou le SecretKey?
Même si cela peut théoriquement répondre à la question, il serait préférable pour inclure l'essentiel des éléments de réponse ici, et de fournir le lien de référence.
Il y a une réponse dans un précédent post ce lien. Espérons que cette aide!
donc, il semble que le java exemple ne prend pas en charge ce dont j'ai besoin: 'java.de sécurité.InvalidKeyException avec le message "Illégal taille de la clé ou les paramètres par défaut" '
Aussi, est-il une limitation sur le Chiffrement, ou le SecretKey?
Même si cela peut théoriquement répondre à la question, il serait préférable pour inclure l'essentiel des éléments de réponse ici, et de fournir le lien de référence.
OriginalL'auteur wuntee | 2010-04-02
Vous devez vous connecter pour publier un commentaire.
De renforcer la force de la clé de chiffrement, vous devez télécharger Java Cryptography Extension (JCE) Force Illimitée de la Compétence de la Politique de Fichiers.
http://java.sun.com/javase/downloads/index.jsp (Vérifier D'Autres Téléchargements).
Vous n'avez pas à les ajouter au projet, ceux sont des bibliothèques d'exécution. L'README.txt les états de fichier que vous devez installer sur votre runtime dossier de sécurité (remplacer les fichiers) Si vous utilisez le JDK alors: /chemin/vers/jdk/jre/libs/sécurité/ Si votre utilisation de la JRE à la place: /chemin/vers/jre/libs/sécurité/
N'a qu'à résoudre votre question?
OriginalL'auteur Mohamed Mansour
Vous pouvez installer la JCE Force Illimitée, pots, comme il est suggéré sur plusieurs autres questions similaires, ou tout simplement essayez d'inclure ce code dans votre fonction principale ou le conducteur.
OriginalL'auteur Sean
Ici, le problème est l'inadéquation entre la taille des clés pour votre fonction de dérivation de clé et les algorithmes. Le PBKDF vous utilisez est
"PBEWithMD5AndDES"
et dans cette chaîne de laDES
partie indique le type de sortie. Comme DES simple comme il est connu utilise seulement 8 octets clés (64 bits, 56 efficace de bits de taille avec les bits de parité). Des clés AES doit être de 128, 192 et 256 bits et ne doivent pas inclure des bits de parité.Pour créer AES force des tailles de clé vous devez au moins utiliser PBKDF2 au lieu de PBKDF1, de préférence avec l'algorithme SHA-256 ou SHA-512 pour la hausse des tailles de clé. Pour les clés 128 bits, vous devriez être bien avec SHA-1. Donc, utiliser l'accumulation dans
"PBKDF2WithHmacSHA1"
SecretKeyFactory
à la place. Notez que PBKDF2 /SHA1 avec des clés de plus de 160 bits entraînera dans des conditions non optimales de fonctionnement. Vous pouvez utiliser un simple basée sur une clé touche de fonction de dérivation (KBKDF) sur la sortie si vous souhaitez créer plus de données (comme un distinct IV).Comme d'autres l'ont indiqué, si vous utilisez des clés de 128 bits, vous aurez besoin de l'illimité crypto compétence des fichiers.
Notes sur le code suivant:
OriginalL'auteur Maarten Bodewes
à l'aide de tout remplissage des mécanismes pour combler le vide bits
OriginalL'auteur Wajdy Essam
Quand je place le code suivant et de l'exécuter, je ne reçois pas toutes les exceptions:
Je n'ai jamais été en mesure de recréer l'exception que vous avez eu. Je suis en cours d'exécution J2SE 1.6 et développement sur Eclipse.
Pourrait-il que votre mot de passe n'est pas 16 octets de long?
GeneralSecurityException
et, normalement, vous le jetez dans votre méthode, ou de vous créer une exception d'exécution (par exemple, unIllegalStateException
si l'algorithme ne peut pas être trouvé).Je n'ai pas retiré la protection. Le encrypt() les appels de méthode getSecretKey() qui appelle la PBEKeySpec() comme l'OP a dans son code d'origine.
OriginalL'auteur Chopstick