2010-12-10 8 views
9

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?

Odpowiedz

19

Wygenerowany klucz to 128 bajtów, a nie 128 bitów. "Kluczowa długość" powinna wynosić 16.

+0

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

+0

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

+0

Przy okazji: Android używa BouncyCastle jako dostawcy zabezpieczeń ... – Peter

1

Ten wyjątek w zasadzie występuje z powodu długości klucza, który został przekazany do szyfrowania. Jeśli używasz szyfrowania AES, liczba znaków musi wynosić 128/192/256 bitów . Na przykład możesz użyć klawisza 16-znakowego, 24-znakowego lub 32-znakowego.

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

Nadzieja to pomaga ...

+0

Istnieje już zaakceptowana odpowiedź. –

Powiązane problemy