2012-07-16 8 views
10

暗号化が新しくなりました。復号化エラー:「必要なときにivを設定していません」

私はバイト配列を復号化しようとしていますが、IVを提供しているときに例外が発生しています: InvalidAlgorithmParameterException(予想通りにivが設定されていません)。ここで

は(IV nullでなく、暗号化する際に使用される値を持つ16バイトの配列である)私のコードです:

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

私は暗号がOK初期化されるIVを指定しない場合:私は、私が使用していたバージョンに対応するが、私、私はそれがcorrec理解しておりません事になり、いくつかのコードを持っていないかもしれませんJCEStreamCipher(here)の実装を見つけた答えを見つけようとして

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

tly。

ここでは、コードです:

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"); 
     } 
    } 

は、復号化の際、私はIVを提供することができないように見えるが、それは私にはあまり意味を成していませんが。

ご協力いただければ幸いです。

ありがとう、 richard

+0

申し訳ありませんが、私は本当にあなたの問題を理解していません。 JCEStreamCipherのコードではなく、使用しているコード(2行以上)を投稿してください。 – Robert

+0

あなたは「私は復号化するときにIVを提供できないように見えますが、なぜそうではありませんか?通常の方法は、IVを暗号文の先頭に付加して送信する方法です。受信者は最初の16バイトをIVとして残りのメッセージを復号化します。 – rossum

+0

それは私がそれをやっている方法ですが、私は困惑していたdecrypterにIVを提供するときに例外があります。キーを作成するときにエラーが発生しました(ちょうど答えを投稿しました)。 – richardtz

答えて

13

解決済み。

私は誤ったSecretKeyを使用していました.AES用に作成することはできません。

は、以前私が持っていた:

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

JCEPBEKeyを作成します。

私が行方不明になった:AESのためのappropiateキーを作成します

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

を。

+1

優れています。このエラーは、オフィスにあった4.0.3デバイスの古いバージョンでのみ発生していましたが、他のバージョンでは発生していませんでした。今これはプラットフォーム間で動作します。 –

関連する問題