AES で暗号化されたパケット (つまり、ストリームではない) を使用するプロトコルを作成しています。統合認証を提供し、NSA のスイート B の一部であるため、GCM (CTR に基づく) を使用することにしました。AES キーは ECDH を使用してネゴシエートされ、公開キーは web- ECDSAのようなものを使用した信頼の。GCM には 128 ビットの nonce / 初期化ベクトルが必要だと思います。なぜなら、AES に 256 ビットの鍵を使用しているにもかかわらず、常に 128 ビットのブロック暗号だからです (右?) 後で 96 ビットの IV を使用しますBCコードを読み取ります。
私は間違いなく独自のアルゴリズムを実装していません (プロトコルのみ -- 私の暗号プロバイダーは BouncyCastle です)。同じ DH キーを持つ 2 人の間で使用される AES キーは一定のままであるため、同じノンスを複数のパケットに使用すべきではないことがわかっています。
単純に 96 ビットの疑似乱数をパケットの先頭に追加し、受信者にこれをノンスとして使用させることはできますか? これはピア ツー ピア ソフトウェアであり、パケットはいつでも送信できます (例: インスタント メッセージ、ファイル転送要求など)。乱数ソース。ノンスは秘密にする必要はまったくありませんよね?それとも、必然的に「暗号的に安全な」PNRG と同じくらいランダムですか? ウィキペディアは、それはランダムであるべきだと言っています。さもなければ、選択された平文攻撃の影響を受けやすいと言っていますが、両方の主張の横に「引用が必要です」とあり、それがブロック暗号に当てはまるかどうかはわかりません. 特定のAESキーで送信されたパケットの数をカウントするカウンター(128ビットブロックの数のカウンターとは別)を実際に使用できますか?1から?明らかに、これによりノンスが予測可能になります。GCM が暗号化だけでなく認証も行うことを考えると、これはその認証機能を危うくするでしょうか?