2010-12-10 31 views
9

Tôi đang cố mã hóa chuỗi trên Android bằng AES. Khóa đối xứng được xác định trước đó với thuật toán Diffie-Hellman và có vẻ là ok (Độ dài khóa là 128 bit, xem bên dưới).
Tuy nhiên, tôi nhận được một Mã InvalidKeyException: "Key length not 128/192/256 bits. "Mã hóa AES: InvalidKeyException: Độ dài khóa không 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(); 
    } 

Bộ luật nêu trên dẫn đến kết quả như sau:

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

Sau đó, tôi nhận được InvalidKeyException: Key length not 128/192/256 bits. Nhưng như bạn có thể nhìn thấy , Khóa Bí mật có độ dài 128 bit!

Bất kỳ ý tưởng nào?

Trả lời

19

Khóa bạn đã tạo là 128 byte, không phải 128 bit. "Key Length" nên là 16.

+0

1 đánh bại tôi vào nó. @Peter: Nơi duy nhất bạn sẽ tìm thấy một tài sản Length đại diện cho số bit sẽ là một bộ sưu tập bit chuyên dụng. 99,9% thời gian sẽ là số ký tự hoặc byte. –

+0

Hmm, bạn rõ ràng là đúng. Vì vậy, việc sử dụng KeyAgreement.generateSecret ("AES") trả về một khóa có độ dài 128 byte. Rõ ràng, đó là quá nhiều ... Làm thế nào tôi có thể có được một chìa khóa với chúng ta hãy nói 256 Bit? Cảm ơn – Peter

+0

Nhân tiện: Android sử dụng BouncyCastle làm Nhà cung cấp Bảo mật ... – Peter

1

Ngoại lệ này về cơ bản xảy ra do độ dài của khóa mà bạn đã chuyển cho mã hóa. Nếu bạn đang sử dụng mã hóa AES thì số ký tự phải dài 128/192/256 bit . Ví dụ: bạn có thể sử dụng khóa gồm 16 ký tự, 24 ký tự hoặc 32 ký tự.

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

Hope trợ giúp này ...

+0

Đã có câu trả lời được chấp nhận. –

Các vấn đề liên quan