4.2.3. レコード番号暗号化
4.2.3. レコード番号暗号化 (Record Number Encryption)
DTLS 1.3では、レコードが暗号化されるとき、レコードシーケンス番号も暗号化されます。基本的なパターンは、AEADアルゴリズムで使用される基礎となる暗号化アルゴリズムを使用してマスクを生成し、それをシーケンス番号とXOR演算することです。
AEADがAESベースの場合、マスクは暗号文の最初の16バイトに対してAES-ECBを計算することで生成されます:
Mask = AES-ECB(sn_key, Ciphertext[0..15])
AEADがChaCha20ベースの場合、マスクは暗号文の最初の4バイトをブロックカウンターとして扱い、次の12バイトをノンスとして扱い、それらをChaCha20ブロック関数([CHACHA]のセクション2.3)に渡すことで生成されます:
Mask = ChaCha20(sn_key, Ciphertext[0..3], Ciphertext[4..15])
sn_keyは次のように計算されます:
[sender]_sn_key = HKDF-Expand-Label(Secret, "sn", "", key_length)
[sender]は送信側を示します。使用されるエポックごとのSecret値は[TLS13]のセクション7.3で説明されています。各エポックに新しいキーが使用されることに注意してください:エポックは平文で送信されるため、これは曖昧さをもたらしません。
暗号化されたシーケンス番号は、マスクの先頭バイトとシーケンス番号のワイヤー表現をXOR演算することによって計算されます。復号化は同じプロセスで実行されます。
この手順では、暗号文の長さが少なくとも16バイトである必要があります。受信者は、セクション4.5.2で説明されているように、保護解除に失敗したかのように、より短いレコードを拒否しなければなりません。送信者は、適切な長さの暗号文を作成するために、短い平文をパディングしなければなりません(従来のレコードパディングメカニズムを使用)。ほとんどのDTLS AEADアルゴリズムは16バイトの認証タグを持ち、パディングは不要です。ただし、TLS_AES_128_CCM_8_SHA256などの一部のアルゴリズムは、より短い認証タグを持ち、短い入力に対してパディングが必要になる場合があります。
AESまたはChaCha20に基づかない将来の暗号スイートは、DTLSで使用するために独自のレコードシーケンス番号暗号化を定義しなければなりません。
シーケンス番号暗号化は、DTLSCiphertext構造にのみ適用され、DTLSPlaintext構造にはシーケンス番号が含まれていても適用されないことに注意してください。