2010-12-10 4 views
9

Ich versuche, eine Zeichenfolge auf Android mit AES zu verschlüsseln. Der symmetrische Schlüssel wird zuvor mit dem Diffie-Hellman-Algorithmus bestimmt und scheint in Ordnung zu sein (Schlüssellänge ist 128 Bit, siehe unten).
Trotzdem bekomme ich eine InvalidKeyException: "Key length not 128/192/256 bits. "AES-Verschlüsselung: InvalidKeyException: Schlüssellänge nicht 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(); 
    } 

Der obige Code führt zu folgender Ausgabe:

_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_ 

Danach habe ich die InvalidKeyException: Key length not 128/192/256 bits. bekommen Aber wie Sie sehen können hat der SecretKey eine Länge von 128 Bits!

Irgendwelche Ideen?

Antwort

19

Der von Ihnen generierte Schlüssel ist 128 Bytes, nicht 128 Bits. "Schlüssellänge" sollte 16 sein.

+0

+1, um es Schlag mich. @Peter: Der einzige Ort, an dem Sie eine Length-Eigenschaft finden, die die Anzahl der Bits repräsentiert, ist eine spezialisierte Bit-Sammlung. 99,9% der Zeit wird es eine Anzahl von Zeichen oder Bytes sein. –

+0

Hmm, du hast offensichtlich Recht. Also liefert KeyAgreement.generateSecret ("AES") einen Schlüssel mit einer Länge von 128 Bytes. Offensichtlich ist das zu viel ... Wie kann ich einen Schlüssel mit sagen wir 256 Bit erhalten? Danke – Peter

+0

Übrigens: Android verwendet BouncyCastle als Sicherheitsanbieter ... – Peter

1

Diese Ausnahme tritt grundsätzlich aufgrund der Länge des Schlüssels auf, den Sie für die Verschlüsselung übergeben haben. Wenn Sie die AES-Verschlüsselung verwenden, muss die Anzahl der Zeichen 128/192/256 Bit betragen . Zum Beispiel können Sie den Schlüssel aus 16 Zeichen, 24 Zeichen oder 32 Zeichen verwenden.

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

Hope this help ...

+0

Es gibt bereits eine akzeptierte Antwort. –