InputStream/OutputStreams を使用して、Java の暗号文 (IV とアルゴリズムのパラメーターを含む暗号化してから MAC) で HMAC を計算する簡単な方法を探しています。
試行の失敗: 最初に CipherOutputStream からの継承を試みましたが、暗号文が書き込まれた後にプログラムで取得することは許可されていません。CipherOutputStream を使用すると、MAC-then-encrypt のみを実装できるという結論に至りました。コードはこちら: http://pastebin.com/armvDN3N
成功した試み: 次に、CipherOutputStream の OpenJDK7 ソース コードをベースとして CipherHmacOutputStream クラスを実装しました。このクラスは、write() が呼び出されるたびに Hmac を更新し (mac.update())、close が呼び出されたときにストリームに追加します。コードはこちら: http://pastebin.com/fF8WFBpA
問題は、一致する CipherHmacInputStream を書き込もうとしたときに、ストリームがいつ終了するかを知る方法がないため、HMAC がいつ開始するかを知る明確な方法がないことです。available() メソッドは、バッファ内の「新しい」復号化されたバイトのみを返します。その結果、復号化 (cipher.update()) が HMAC を誤って復号化しようとする可能性があります。私はすでにこれに少し時間を費やしましたが、HMAC を使用してストリームベースの暗号化/復号化を行うためのより簡単な方法があるはずです。GCM/EAX は明白な答えですが、アルゴリズム/モードを構成可能なままにし、GCM/EAX が使用されていない場合はメッセージ認証も提供したいと考えています。
あなたはなにか考えはありますか?これを行う標準的な方法はありますか?