4.2.3. 记录号加密
4.2.3. 记录号加密 (Record Number Encryption)
在DTLS 1.3中,当记录被加密时,记录序列号也被加密。基本模式是使用AEAD算法所用的底层加密算法生成一个掩码,然后与序列号进行异或运算。
当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节中描述。请注意,每个纪元使用一个新密钥:因为纪元是明文发送的,这不会导致歧义。
加密的序列号通过将掩码的前导字节与序列号的线路表示进行异或运算来计算。解密通过相同的过程完成。
此过程要求密文长度至少为16字节。接收方必须拒绝较短的记录,就像它们未能解除保护一样,如第4.5.2节所述。发送方必须填充短明文(使用传统的记录填充机制),以便生成合适长度的密文。请注意,大多数DTLS AEAD算法具有16字节的认证标签,不需要填充。但是,某些算法(如TLS_AES_128_CCM_8_SHA256)具有较短的认证标签,对于短输入可能需要填充。
未来不基于AES或ChaCha20的密码套件必须定义自己的记录序列号加密,以便与DTLS一起使用。
请注意,序列号加密仅应用于DTLSCiphertext结构,而不应用于DTLSPlaintext结构,尽管它也包含序列号。