パフォーマンス上の理由から、可能な限り特定のキーに対して Cipher オブジェクト (java) を再利用したいと考えています。ただし、適切な暗号衛生に従い、暗号化する平文のすべてのセットでランダム IV を使用したいと考えています。同じ暗号オブジェクトを再利用し、IV を変更して、暗号オブジェクトを毎回再初期化せずに (つまり、最初に 1 回だけ初期化するだけで) 行うことは可能ですか? doFinal 呼び出しのたびに新しい IV を使用したい。必要に応じて、毎回の doFinal 呼び出しの後に手動で設定できます。
IVParameterSpec を拡張し、getIV メソッドをオーバーライドして毎回ランダムなメソッドを生成することを考えましたが、それには 2 つの問題があります。
おそらく実際には問題にならないでしょうが、特定の CipherSpi オブジェクトが特定の平文に対してこれを 2 回呼び出していないことをどのように知ることができますか? 特定の平文に対しては同じ IV を返す必要がありますが、別の平文に対しては別の IV を返す必要があります。ほとんどのプロバイダーはこれを 2 回呼び出すことはないと思いますが、確かなことはわかりません。
CipherSpi のドキュメントを見ると、初期化時に IVParameterSpec が渡されたように見えます。プロバイダーがすぐに IV を取得し、オブジェクトの存続期間中それをキャッシュするかどうかはわかりません。その場合、暗号化する平文が異なるかどうかに関係なく、IV は常に同じになります。
Cipher オブジェクトを再利用し、再初期化を必要としない doFinal 呼び出しごとに IV を変更する別の方法はありますか? SIV のような一部のモードでは IV 要件がそれほど厳しくないことは承知していますが、現時点ではそれを選択することはできません。また、上記のソリューションをサポートする可能性のある特定のプロバイダーを選択できることは承知していますが、プロバイダーに依存しないソリューションを望んでいました。
ありがとう!