Sto tentando di crittografare una stringa su Android con AES. La chiave simmetrica viene determinata in precedenza con l'algoritmo Diffie-Hellman e sembra essere ok (Key Length è 128 bit, vedi sotto).
Tuttavia, ho ottenere un codice InvalidKeyException: "Key length not 128/192/256 bits.
"Crittografia AES: InvalidKeyException: lunghezza chiave non 128/192/256 bit
:
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();
}
il codice qui sopra porta alla seguente uscita:
_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_
Dopo di che, ho l'InvalidKeyException: Key length not 128/192/256 bits.
Ma come si può vedere , la SecretKey ha una lunghezza di 128 bit!
Qualche idea?
uno mi ha battuto ad esso. @Peter: l'unico posto in cui troverai una proprietà Length che rappresenta il numero di bit sarà una raccolta di bit specializzata. Il 99,9% delle volte sarà un conteggio di caratteri o byte. –
Hmm, hai ovviamente ragione. Quindi, utilizzando KeyAgreement.generateSecret ("AES") restituisce una chiave con una lunghezza di 128 byte. Ovviamente, è troppo ... Come posso ottenere una chiave con diciamo 256 bit? Grazie – Peter
A proposito: Android utilizza BouncyCastle come Fornitore di sicurezza ... – Peter