Próbuję zaszyfrować ciąg znaków na Androidzie za pomocą AES. Klucz symetryczny jest określany wcześniej za pomocą algorytmu Diffiego-Hellmana i wydaje się, że jest w porządku (długość klucza wynosi 128 bitów, patrz poniżej).
Niemniej jednak, mam InvalidKeyException: "Key length not 128/192/256 bits.
"Szyfrowanie AES: InvalidKeyException: Długość klucza nie 128/192/256 bitów
Kod:
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();
}
Powyższy kod powoduje następujące dane wyjściowe:
_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_
potem dostaję InvalidKeyException: Key length not 128/192/256 bits.
Ale jak widać , SecretKey ma długość 128 bitów!
Jakieś pomysły?
+1 beat mnie do niego. @Peter: Jedynym miejscem, w którym znajdziesz właściwość Length, reprezentującą liczbę bitów, będzie wyspecjalizowany zbiór bitów. 99,9% czasu będzie liczbą znaków lub bajtów. –
Hmm, oczywiście masz rację. Tak więc użycie KeyAgreement.generateSecret ("AES") zwraca klucz o długości 128 bajtów. Oczywiście, to za dużo ... Jak mogę zdobyć klucz z powiedzmy 256 bitów? Dzięki: – Peter
Przy okazji: Android używa BouncyCastle jako dostawcy zabezpieczeń ... – Peter