Obtenir de l'Exception java.de sécurité.InvalidKeyException: Invalid AES longueur de la clé: 29 octets?
Lors de l'exécution ci-dessous le programme, j'obtiens cette exception. Pas en mesure de déterminer ce que le problème AES permet à l'128 -256 bits de clé?
Exception in thread "main" java.security.InvalidKeyException: Invalid AES key length: 29 bytes
at com.sun.crypto.provider.AESCipher.engineGetKeySize(DashoA13*..)
at javax.crypto.Cipher.b(DashoA13*..)
Arriver exception à la ligne 20
Voici le programme
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AESEncryptionDecryptionTest {
private static final String ALGORITHM = "AES";
private static final String myEncryptionKey = "ThisIsSecurityKey";
private static final String UNICODE_FORMAT = "UTF8";
public static String encrypt(String valueToEnc) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key); //////////LINE 20
byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = new BASE64Encoder().encode(encValue);
return encryptedValue;
}
public static String decrypt(String encryptedValue) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}
private static Key generateKey() throws Exception {
byte[] keyAsBytes;
keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);
Key key = new SecretKeySpec(keyAsBytes, ALGORITHM);
return key;
}
public static void main(String[] args) throws Exception {
String value = "password1";
String valueEnc = AESEncryptionDecryptionTest.encrypt(value);
String valueDec = AESEncryptionDecryptionTest.decrypt(valueEnc);
System.out.println("Plain Text : " + value);
System.out.println("Encrypted : " + valueEnc);
System.out.println("Decrypted : " + valueDec);
}
}
l'instruction qui génère l'exception?
c.init(Cipher.ENCRYPT_MODE, key);
c.init(Cipher.ENCRYPT_MODE, key);
OriginalL'auteur M Sach | 2012-05-31
Vous devez vous connecter pour publier un commentaire.
AES permet de 128, 192 ou 256 bits, la longueur de la clé. C'est-à 16, 24 ou 32 octets. Essayez de prendre seulement les 16 premiers octets de votre
mEncryptionKey
comme lekeyAsBytes
.Edit:
Après si se passait pour moi. Une habitude que j'ai formé, et un que je recommande, c'est de prendre un SHA hachage d'un mot de passe/mot de passe, et de l'utiliser comme source d'octets de votre clé. En prenant une valeur de hachage garantit la clé de données sera de la bonne taille, quelle que soit la longueur du mot de passe/mot de passe. De votre courant de la mise en œuvre de l'aide de la Chaîne d'octets a deux problèmes;
Ces problèmes sont éliminés en utilisant une table de hachage.
Prendre un coup d'oeil à la
buildKey()
méthode dans cette classe; https://github.com/qwerky/DataVault/blob/master/src/qwerky/tools/datavault/DataVault.javaPour utiliser 192 ou 256 vous pouvez avoir besoin d'activer l'option "illimité force de la clé de" la politique de fichiers. Cela est dû à une restriction légale aux États-unis. Voir ici; java.sun.com/developer/technicalArticles/Security/AES/.... Recherche
Illegal key size or default parameters
sur ce site, il y a plusieurs questions et réponses à ce sujet.Dans votre exemple, Datavault.java, BouncyCastleProvider est utilisée, ce qui n'est pas standard de java de la classe. En raison de certaines restrictions, j'ai besoin d'aller seulement avec la norme des classes java. Puis-je utiliser une autre implémentation de la classe de fournisseur instaed de BouncyCastleProvider dans l'exemple que vous vha epointed?
Si le but est de rendre la clé, basée sur certaines entrées comme le mot de passe utilisateur, le hachage est bon, mais PBKDF2 est mieux. Si possible, utilisez par clé aléatoire de sel et de l'enregistrer pour la prochaine fois que vous utilisez la même clé. Si ce n'est pas possible, essayez d'utiliser certains par utilisateur unique de données (par exemple, nom d'utilisateur) comme le sel. Cela vous aide à vous protéger contre les rainbow table des attaques. Voir ici pour un exemple stackoverflow.com/questions/2375541/...
En fait, je suis
java.security.InvalidKeyException: Invalid key length: 32 bytes
pour SHA.OriginalL'auteur Qwerky
Les principales utilisations de l'aléatoire comme entrée, mais il y a stiill exigences pour la manière dont il est composé. Le
SecretKeySpec
constructeur, vous utilisé pour le chargement déjà d'une clé générée dans la mémoire. Au lieu de cela, utiliserKeyGenerator
.Noter également que l'AES-128 est maintenant effectivement plus faible que le cryptage AES-256. Il n'est probablement pas très différent, mais le bénéfice de la prolongation de la taille de la clé peuvent être compensés par des simplifications ailleurs (moins de tours).
OriginalL'auteur John Watts