0

インライン IV を使用した CBC モードでの AES 暗号化であるこのコードを実装したいと思いますが、次のエラー メッセージが表示されます。

IV の長さが間違っています: 16 バイトの長さでなければなりません

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

package implementaes;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec;

public class Aesaesaes
{
    public static void main(String[] args)
    {
        try
        {
                //Lookup a key generator for the AES cipher
                        KeyGenerator kg = KeyGenerator.getInstance("AES");
            SecretKey key = kg.generateKey();

            SecretKeySpec keySpec = new
                        SecretKeySpec(key.getEncoded(), "AES");     
                //Lookup an instance of a AES cipher
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

                //initialize IV  manually

                byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

                //create IvParameterSpecobject

                IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);     

               //Initialize the cipher using the secter key

            cipher.init(Cipher.ENCRYPT_MODE, keySpec,ivSpec);

                String plainText = "This is a secret!";



            byte[] cipherText = cipher.doFinal(plainText.getBytes());

            System.out.println("Resulting Cipher Text:\n");
            for(int i=0;i<cipherText.length;i++)
            {
                System.out.print(cipherText[i] + " ");
            }
            System.out.println("");



        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

どうすれば整理できますか?ところで、私が試した:

byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00};

16バイトにしますが、機能しません

4

1 に答える 1

0

定義している ivBytes は現在 8 バイトです。

byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

ivBytes配列内の各メンバーは1 バイトを表します。16 エントリの配列が必要です。

byte[] ivBytes = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  

更新 IVに独自の値を提供することは明らかだと思いましたが、IVをすべてゼロに初期化しないことが最善の利益であるというデイブのコメントを指摘することはおそらく価値があります。IVの選び方を見る

于 2016-04-20T13:08:01.617 に答える