2012-07-16 20 views
10

Tôi gần như mới để mã hóa.Lỗi giải mã: "không có thiết lập iv khi một người mong đợi"

Tôi đang cố gắng giải mã một mảng byte và khi tôi cung cấp IV, tôi nhận được ngoại lệ: InvalidAlgorithmParameterException (không đặt iv khi được mong đợi).

Dưới đây là mã của tôi (iv là một mảng của 16 byte mà không phải là null và có giá trị sử dụng khi mã hóa):

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey,new IvParameterSpec(iv)); 

Nếu tôi không chỉ định IV mật mã được khởi ok :

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey); 

Cố gắng tìm một câu trả lời tôi đã tìm thấy một thi hành JCEStreamCipher (here) mà có thể không tương ứng với phiên bản tôi đang sử dụng nhưng có một số mã mà làm cho tôi điều tôi không hiểu nó correc tly.

Dưới đây là các mã:

if ((ivLength != 0) && !(param instanceof ParametersWithIV)) 
    { 
     SecureRandom ivRandom = random; 

     if (ivRandom == null) 
     { 
      ivRandom = new SecureRandom(); 
     } 

     if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) 
     { 
      byte[] iv = new byte[ivLength]; 

      ivRandom.nextBytes(iv); 
      param = new ParametersWithIV(param, iv); 
      ivParam = (ParametersWithIV)param; 
     } 
     else 
     { 
      throw new InvalidAlgorithmParameterException("no IV set when one expected"); 
     } 
    } 

Hình như tôi không thể cung cấp một IV khi giải mã, nhưng nó không làm cho quá nhiều ý nghĩa với tôi.

mọi trợ giúp sẽ được đánh giá cao.

cảm ơn rất nhiều, người giàu.

+0

Xin lỗi, nhưng tôi thực sự không hiểu vấn đề của bạn. Có thể bạn nên đăng mã bạn đang sử dụng (nhiều hơn hai dòng) thay vì mã từ JCEStreamCipher. – Robert

+0

Bạn nói, "Có vẻ như tôi không thể cung cấp IV khi giải mã" Tại sao không? Phương pháp thông thường là thêm IV vào trước bản mã và truyền chúng lại với nhau. Người nhận sử dụng 16 byte đầu tiên làm IV để giải mã phần còn lại của tin nhắn. – rossum

+0

Đó là cách tôi đang làm điều đó, nhưng tôi đã có ngoại lệ khi cung cấp IV cho decrypter, điều này khiến tôi bối rối. Tôi đã gặp lỗi khi tạo khóa (chỉ cần đăng câu trả lời). – richardtz

Trả lời

13

Đã giải quyết.

Tôi đã sử dụng sai SecretKey, không phải là khóa bạn có thể tạo cho AES.

Trước đây tôi đã có:

KeySpec spec = new PBEKeySpec(password.toCharArray(), encryptionKeySalt, 12345,256); 
SecretKey encriptionKey = factory.generateSecret(spec); 

mà tạo ra một JCEPBEKey.

tôi nhớ da diết:

Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 

mà tạo ra một chìa khóa thích hợp cho AES.

+1

Tuyệt vời. Lỗi này chỉ xảy ra trên một phiên bản cũ hơn của thiết bị 4.0.3 đã ở trong văn phòng, chứ không phải trên các thiết bị khác. Bây giờ điều này hoạt động trên các nền tảng. –

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