1. ホーム
  2. java

[解決済み] IvParameterSpec の有無にかかわらず、AES 暗号を開始した場合、何か違いがありますか?

2022-02-12 09:54:47

質問

IvParameterSpecの有無に関わらず、AES暗号を開始した場合、何か違いがあるのでしょうか?

IvParameterSpecを使用する場合

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));

IvParameterSpec を使用しない場合

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

いくつかのテストデータでテストしてみましたが、暗号化と復号化の結果は同じでした。

しかし、私はセキュリティの専門家ではないので、何かを見逃して、潜在的なセキュリティのループホールを作りたくはないのです。どちらが正しい方法なのでしょうか?

解決方法は?

背景を少し説明します(すでにご存じでしたらすみません、同じ用語を使っていることを確認するためです)。

  • AESは ブロック暗号 128ビットブロック上で動作する暗号化アルゴリズム。
  • CBCは ブロック暗号モード 大量のデータを暗号化するためにブロック暗号を使用する方法です。
  • ブロック暗号モードには 初期化ベクトル (IV)は、初期化データのブロックであり、通常は基礎となる暗号のブロックサイズと同じ大きさです。

(ブロック暗号のモードに関するウィキペディアは-。 http://en.wikipedia.org/wiki/Block_cipher_mode - が実によくできていて、なぜIVが必要なのかがよくわかる)

ブロックモードによって、点滴の選択プロセスに課される要件は異なりますが、共通していることがあります。

同じIVと鍵で2つの異なるメッセージを暗号化してはならない。 そうすると、通常、攻撃者はあなたの平文と、時にはあなたの鍵(または同等の有用なデータ)を入手することができます。

CBCは、IVが攻撃者にとって予測不可能でなければならないという追加の制約を課しているのです - ですから、artjom-bの提案する SecureRandom を生成するのは良い方法だと思います。


さらに、artjob-bが指摘するように、CBCは機密性を与えるだけです。つまり、データは秘密にされるけれども、それがきちんと届くという保証はないということです。理想的には 認証済み モード、例えばGCM、CCM、EAXなどです。

これらのモードのいずれかを使用することは 本当に、本当に良いアイデアです . Encrypt-then-MACは専門家でも扱いにくいので、できる限り避けてください。(どうしてもやらなければならない場合は しなければならない 暗号化キーとMACキーは別のものを使用します)。