短期キーでECDHを使用するセキュリティシステムの調査/開発を行っています。
私のコードでは現在256ビットのECを使用しているため、2つの部分で共有シークレットを計算すると、共有シークレットを含む32B(256ビット)配列が取得されます。
ここで、この共有シークレットを使用して、AES-128(128ビットのキーサイズ)などの対称キー暗号化アルゴリズムのキーを計算します。
それで私の質問は、256ビットの共有シークレットを128ビットのAESキーに削減する方法ですか?共有暗号化を対称暗号化のキーとして使用する前にハッシュ化する方が良い方法を読んだことがありますが、ハッシュアルゴリズムを使用しますか? SHA-256を使用している場合でも、256ビットのキーを取得します。 ECDH共有秘密から対称暗号化キーを構築する標準的な方法はありますか?
一般に、いくつかの「秘密」から対称鍵を生成することはkey derivationと呼ばれ、 key derivation function を使用します。いくつかのKDFデザインがあります。多くのプロトコルが独自のプロトコルを定義しています(例: SSL/TLS )。実際、SSL/TLSの詳細を調べることは(教育的に)良いアイデアです。
IETFに裏打ちされた標準構成を定義するための現在の「プッシュ」があり、それは [〜#〜] hkdf [〜#〜] ;と呼ばれます。 KDFが必要な場合は、HKDFを選択するよりも悪い結果になる可能性があります(比較的新しいものですが、堅牢な暗号化基盤の恩恵を受けており、少なくとも他の競合他社と同じくらい安全に見えます)。
限られた量の鍵データ(128ビットなど)のみが必要な場合は、通常のハッシュ関数(SHA-256など)の1つを使用して、出力を切り捨てることができます。切り捨てが問題ないのは、ではありませんハッシュ関数が、たとえば、衝突に強いという結果です。ただし、非病理学的ハッシュ関数の設計、特にSHA-256では十分に安全であると考えられています。
規格については、そうです。それは ANSI X9.6 と呼ばれます。これは無料の標準ではないので(法的に言えば、支払う必要があるので支払う必要があります)、アマチュアや学生は通常それを考慮しないため、オープンソースソフトウェアに浸透しません。そのKDFはSHA-1に基づいています。基本的には、SHA-1(secret||counter)を逐次計算しますカウンターの値は、KDFに関しては、それほど魅力的ではありませんが、それほど魅力的ではありません(私は古いドラフトしかないため、X9.63の新しいバージョンではSHA-256を使用する場合があります)。
SHA-256出力を必要なバイト数に切り捨てるだけで問題はありません。
また、AES-128を使用している場合でも、追加の利用可能なバイト(例: IVを初期化する(IVを使用するモードでAESを使用している場合)、またはMACキーとして使用する(データを認証するために別のプリミティブを使用している場合)。