11

私は暗号化にほとんど慣れていません。

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

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

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

IV を指定しない場合、暗号は問題なく初期化されます。

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

答えを見つけようとすると、使用しているバージョンに対応していない可能性がある JCEStreamCipher ( here ) の実装が見つかりましたが、正しく理解していないと思わせるコードがいくつかあります。

コードは次のとおりです。

   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 を提供できないように見えますが、あまり意味がありません。

どんな助けでも大歓迎です。

どうもありがとう、リチャード。

4

1 に答える 1

13

解決しました。

AES 用に作成できるものではなく、間違った SecretKey を使用していました。

以前は:

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

JCEPBEKey を作成します。

私は行方不明でした:

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

これにより、AES に適切なキーが作成されます。

于 2012-07-16T14:22:06.770 に答える