Estoy intentando encriptar una cadena en Android con AES. La clave simétrica se determinó previamente con el algoritmo Diffie-Hellman y parece estar bien (Key Length es 128 Bit, ver abajo).
Sin embargo, puedo obtener un código InvalidKeyException: "Key length not 128/192/256 bits.
"Encriptación AES: InvalidKeyException: Longitud de la clave no 128/192/256 bits
:
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();
}
el código anterior conduce al siguiente resultado:
_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_
Después de eso, me da la InvalidKeyException: Key length not 128/192/256 bits.
Pero como se puede ver , el SecretKey tiene una longitud de 128 bits!
¿Alguna idea?
1 se me adelantó. @Peter: el único lugar donde encontrará una propiedad de longitud que representa la cantidad de bits será una colección de bits especializada. 99.9% del tiempo será un recuento de caracteres o bytes. –
Hmm, obviamente tienes razón. Entonces, al usar KeyAgreement.generateSecret ("AES"), se devuelve una clave con una longitud de 128 Bytes. Obviamente, eso es demasiado ... ¿Cómo puedo obtener una clave con digamos 256 Bit? Gracias – Peter
Por cierto: Android usa BouncyCastle como proveedor de seguridad ... – Peter