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?
+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. –
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
Übrigens: Android verwendet BouncyCastle als Sicherheitsanbieter ... – Peter