2011-08-01 32 views
14

Khi tôi chạy mã này trong Android, nó không tạo ra lỗi, nhưng khi tôi chạy nó trong một chương trình Java chuẩn, nó tạo ra ngoại lệ: java.security.InvalidKeyException: Kích thước khóa bất hợp pháp.java.security.InvalidKeyException: Kích thước khóa bất hợp pháp

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
SecretKeySpec keySpec = new SecretKeySpec(CHUNK_ENCRYPTION_KEY.getBytes(), 0, 32, "AES"); 
IvParameterSpec initVector = new IvParameterSpec(AES_INITIALIZATION_VECTOR.getBytes(), 0 , 16); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec, initVector); 

CHUNK_ENCRYPTION_KEY là khóa 32 byte được mã hóa cứng vào chương trình. AES_INITIALIZATION_VECTOR là một vector khởi tạo mã hóa cứng 16 byte.

Có ai biết tại sao nó hoạt động trên Android chứ không phải trên Máy tính để bàn không?

+0

Câu hỏi của bạn thiếu dấu chấm hỏi. – Snicolas

+0

@Cảm ơn tôi đang gặp phải sự cố tương tự. Bạn có giải quyết điều này hay không? – NovusMobile

+0

Không, tôi chưa bao giờ có thể giải quyết – Hank

Trả lời

-1

Có thể KEY và Vector khởi tạo được cung cấp của bạn không có 32 byte, tương ứng 16 byte chiều dài. Bạn cũng có thể thử sử dụng các nhà thầu mà không mất các thông số bù đắp và chiều dài của các phím:

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
+0

Tôi đã kiểm tra độ dài byte khi tôi chuyển đổi chúng thành các mảng byte và nếu tôi không thực hiện bù đắp và chiều dài, nó sẽ tạo ra cùng một ngoại lệ. – Hank

+0

là bạn chuyển đổi một chuỗi Hex thành byte? –

+0

vâng, toàn bộ chuỗi khóa của tôi bao gồm 32 ký tự unicode. – Hank

24

Trên một cài đặt JVM desktop mặc định (bằng cách sử dụng JRE hay JDK của Sun/Oracle), AES là giới hạn kích thước khóa 128 bit. Đây là phần còn lại của luật xuất nhập khẩu trên phần mềm mã hóa. Để mở khóa các kích thước khóa AES lớn hơn, bạn cần phải tải xuống và áp dụng "Tập tin chính sách quyền hạn thẩm quyền quyền lực không giới hạn JCE" (xem ở dưới cùng của this page).

Giới hạn kích thước khóa được thực thi bởi mã trong lớp Cipher. Thay đổi nhà cung cấp mật mã (ví dụ: một trong các nhà cung cấp Bouncy Castle hoặc IAIK) sẽ không cho phép bạn phá vỡ hạn chế này.

Trên ghi chú không liên quan, bạn không muốn sử dụng phương pháp getBytes() thô trên String, vì kết quả phụ thuộc vào ngôn ngữ hiện tại (không phải ai cũng sử dụng mã hóa UTF-8 hoặc mã ASCII tương thích). Nếu bạn muốn đại diện cho khóa của mình dưới dạng chuỗi chữ, ít nhất hãy sử dụng mã hóa rõ ràng, chẳng hạn như: CHUNK_ENCRYPTION_KEY.getBytes("UTF-8")

1

Nó không được nêu rõ trong README rằng phải sao chép "Tập tin chính sách quyền hạn không giới hạn sức mạnh JCE" JDK, nếu không nó sẽ không hoạt động. Đường dẫn cho tệp phải là: /path/to/jdk1.7.0_xx/jre/lib/security

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