2010-12-10 34 views
9

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?

Respuesta

19

La clave que generó es 128 bytes, no 128 bits. "Key Length" debería ser 16.

+0

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. –

+0

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

+0

Por cierto: Android usa BouncyCastle como proveedor de seguridad ... – Peter

1

Esta excepción ocurre básicamente debido a la longitud de la clave que ha pasado para el cifrado. Si está utilizando encriptación AES, el número de caracteres debe ser de 128/192/256 bits . Por ejemplo, puede usar la clave de 16 caracteres, 24 caracteres o 32 caracteres.

String encrypted_data=AES.encrypt("HELLO","ASDFGHJKLASDFGHJ"); 

Esperanza esta ayuda ...

+0

Ya hay una respuesta aceptada. –

Cuestiones relacionadas