私の知る限り、CTRモードは初期ベクトルを使用しません。カウンターを取得し、指定されたキーで暗号化してから、暗号文を取得するために結果をプレーンテキストでXORします。
暗号化を行う前のCBCのような他のブロック暗号モードは、平文を初期ベクトルとXORします。
これが私の問題です。私はJavaで次のコードを持っています(bouncycastleライブラリを使用):
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal("Some plaintext");
同じキーを使用して上記のコードを呼び出すたびに、異なる出力が得られます。しかし、行うとき:
byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key, IV);
byte[] result = cipher.doFinal("Some plaintext");
上記のコードを呼び出すたびに同じ結果が得られます。しかし、これはなぜですか?つまり、CTRはIVを必要としないので、すべての呼び出しでIVを与えないと、異なる結果が得られ、IVを与えたときに同じ結果が返されるのはなぜですか?クリック率を使用するときに常に上記のIV(すべてゼロ)を使用する場合、それは安全ですか?
どんなアイデアも非常に役に立ちます。ありがとうございました