4. Cryptographic Dependencies (暗号学的依存関係)
4. Cryptographic Dependencies (暗号学的依存関係)
HPKE の変種は以下のプリミティブに依存します:
鍵カプセル化メカニズム (KEM):
-
GenerateKeyPair(): 鍵ペア (skX, pkX) を生成するランダム化アルゴリズム。 -
DeriveKeyPair(ikm): バイト文字列 ikm から鍵ペア (skX, pkX) を導出する決定論的アルゴリズム。ikm は少なくとも Nsk バイトのエントロピーを持つべきです (議論については第 7.1.3 節を参照)。 -
SerializePublicKey(pkX): 公開鍵 pkX をエンコードする長さ Npk のバイト文字列を生成します。 -
DeserializePublicKey(pkXm): 長さ Npk のバイト文字列を解析して公開鍵を復元します。この関数は pkXm のデシリアライゼーション失敗時にDeserializeErrorエラーを発生させることができます。 -
Encap(pkR): 一時的な固定長対称鍵 (KEM 共有秘密) と, pkR に対応する秘密鍵の保持者によってデカプセル化できるその鍵の固定長カプセル化を生成するランダム化アルゴリズム。この関数はカプセル化失敗時にEncapErrorを発生させることができます。 -
Decap(enc, skR): 秘密鍵 skR を使用して, カプセル化された表現 enc から一時的対称鍵 (KEM 共有秘密) を復元する決定論的アルゴリズム。この関数はデカプセル化失敗時にDecapErrorを発生させることができます。 -
AuthEncap(pkR, skS)(オプション):Encap()と同じですが, 出力は KEM 共有秘密が秘密鍵 skS の保持者によって生成されたという保証をエンコードします。 -
AuthDecap(enc, skR, pkS)(オプション):Decap()と同じですが, 受信者は KEM 共有秘密が秘密鍵 skS の保持者によって生成されたことを確認できます。 -
Nsecret: この KEM によって生成される KEM 共有秘密のバイト単位の長さ。 -
Nenc: この KEM によって生成されるカプセル化された鍵のバイト単位の長さ。 -
Npk: この KEM のエンコードされた公開鍵のバイト単位の長さ。 -
Nsk: この KEM のエンコードされた秘密鍵のバイト単位の長さ。
鍵導出関数 (KDF):
-
Extract(salt, ikm): 入力鍵マテリアル ikm とオプションのバイト文字列 salt から固定長 Nh バイトの疑似ランダム鍵を抽出します。 -
Expand(prk, info, L): オプションの文字列 info を使用して疑似ランダム鍵 prk を L バイトの出力鍵マテリアルに拡張します。 -
Nh:Extract()関数の出力サイズ (バイト単位)。
AEAD 暗号化アルゴリズム [RFC5116]:
-
Seal(key, nonce, aad, pt): 対称鍵 key とノンス nonce を使用して, 平文 pt を関連データ aad とともに暗号化および認証し, 暗号文とタグ ct を生成します。この関数は失敗時にMessageLimitReachedErrorを発生させることができます。 -
Open(key, nonce, aad, ct): 対称鍵 key とノンス nonce を使用して, 暗号文とタグ ct を関連データ aad とともに復号し, 平文メッセージ pt を返します。この関数は失敗時にOpenErrorまたはMessageLimitReachedErrorを発生させることができます。 -
Nk: このアルゴリズムの鍵のバイト単位の長さ。 -
Nn: このアルゴリズムのノンスのバイト単位の長さ。 -
Nt: このアルゴリズムの認証タグのバイト単位の長さ。
上記に加えて, KEM は以下の関数を公開することもできます。その動作は第 7.1.2 節で詳述されています:
-
SerializePrivateKey(skX): 秘密鍵 skX をエンコードする長さ Nsk のバイト文字列を生成します。 -
DeserializePrivateKey(skXm): 長さ Nsk のバイト文字列を解析して秘密鍵を復元します。この関数は skXm のデシリアライゼーション失敗時にDeserializeErrorエラーを発生させることができます。
暗号スイート (ciphersuite) は, 各プリミティブのアルゴリズム選択を含む三つ組 (KEM, KDF, AEAD) です。
これらのプリミティブの具体的なインスタンス化のためのアルゴリズム識別子のセットは第 7 節で提供されます。アルゴリズム識別子の値は 2 バイト長です。
GenerateKeyPair は DeriveKeyPair(random(Nsk)) として実装できることに注意してください。
記法 pk(skX) は, その使用と KEM およびその実装に応じて, 秘密鍵を使用した公開鍵の計算, または秘密鍵オブジェクトとともに格納されていると仮定した公開鍵の取得を表す構文のいずれかです。
KDF 呼び出しのドメイン分離とコンテキストバインディングを容易にするために, 以下の 2 つの関数が定義されています:
def LabeledExtract(salt, label, ikm):
labeled_ikm = concat("HPKE-v1", suite_id, label, ikm)
return Extract(salt, labeled_ikm)
def LabeledExpand(prk, label, info, L):
labeled_info = concat(I2OSP(L, 2), "HPKE-v1", suite_id,
label, info)
return Expand(prk, labeled_info, L)
suite_id の値は KDF が使用される場所に依存します。実装から暗黙的に想定され, パラメータとして渡されません。KEM アルゴリズム内で使用される場合, suite_id は "KEM" で始まり, この KEM アルゴリズムを識別しなければなりません。HPKE の残りの部分で使用される場合, "HPKE" で始まり, 使用中の暗号スイート全体を識別しなければなりません。詳細については第 4.1 節と第 5.1 節を参照してください。