Le chiffrement AES: InvalidKeyException: la longueur de la Clé pas 128/192/256 bits
Je suis en train de chiffrer une chaîne sur Android avec l'algorithme AES. La clé symétrique est déterminé précédemment avec l'algorithme Diffie-Hellman et semble être ok (la Longueur de Clé est de 128 Bits, voir ci-dessous).
Néanmoins, je reçois un InvalidKeyException: "Key length not 128/192/256 bits.
"
Code:
KeyAgreement keyAgree = KeyAgreement.getInstance("DH", "BC");
keyAgree.init(this.smartphonePrivKey);
keyAgree.doPhase(serverPubKey, true);
SecretKey key = keyAgree.generateSecret("AES");
System.out.println("Key Length: " + key.getEncoded().length);
System.out.println("Key Algorithm: "+ key.getAlgorithm());
System.out.println("Key Format: "+ key.getFormat());
byte[] encrypted = null;
Cipher cipher;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
System.out.println("Allowed Key Length: "
+ cipher.getMaxAllowedKeyLength("AES"));
cipher.init(Cipher.ENCRYPT_MODE, key);
encrypted = cipher.doFinal("YEAH".getBytes("UTF8"));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Le Code ci-dessus conduit à la sortie suivante:
_12-10 20:24:53.119: INFO/System.out(757): Key Length: 128_
_12-10 20:24:53.119: INFO/System.out(757): Key Algorithm: AES_
_12-10 20:24:53.119: INFO/System.out(757): Key Format: RAW_
_12-10 20:24:53.470: INFO/System.out(757): Allowed Key Length: 2147483647_
Après, je reçois le InvalidKeyException: Key length not 128/192/256 bits.
Mais comme vous pouvez le voir, le SecretKey a une longueur de 128 Bits!
Des idées?
OriginalL'auteur Peter | 2010-12-10
Vous devez vous connecter pour publier un commentaire.
La clé générée est de 128 octets, pas 128 bits. "La Longueur de la clé" doit être de 16.
Hmm, vous avez évidemment raison. Donc, en utilisant KeyAgreement.generateSecret("AES") renvoie une clé d'une longueur de 128 Octets. Evidemment, c'est trop... Comment puis-je obtenir une clé avec disons 256 Bits? Merci
Par la route: Android utilise BouncyCastle en tant que Fournisseur de services de Sécurité...
Si vous êtes juste de l'échange de messages avec vous-même, vous pouvez utiliser seulement les 16 premiers octets du secret partagé. Normalement, le secret partagé est haché (avec quelques autres) pour produire la réelle clé symétrique. Si vous avez besoin d'inter-opérer, vous aurez à découvrir si vous êtes censé utiliser quelque chose comme le RFC 2631 pour produire les touches. Vous pourriez aussi avoir un problème dans l'utilisation de la BCE. C'est sûr uniquement dans des conditions limitées.
Le hachage du secret partagé avec l'algorithme SHA-256 résolu le problème. Je peux utiliser cette clé maintenant. Je dois avoir un oeil de plus près à la BCE...
OriginalL'auteur erickson
Cette exception, fondamentalement, se produire en raison de la longueur de la clé que vous hava passé pour le chiffrement.Si vous utilisez le chiffrement AES puis le nombre de caractères doit être d'une longueur de 128/192/256 bits.
Par exemple, vous pouvez utiliser la touche de caractère 16,24 caractères ou 32 caractères.
Espérons que cette aide...
Non, ce qui se dilate et s'étend sur la accepté de répondre. Upvote pour la accepté de répondre et ce ajouter.
OriginalL'auteur Anshul Aggarwal