“本页已规定Encode必须无歧义,并说明上下文可由AAD或KDF绑定。协议字段编码把这项要求展开为编码/解析往返、规范字节、资源上限与单射证明;域分离再给出互不相交输入域的随机函数论证。多记…”
形式陈述
设
要求不同用途的编码像集不相交,且每个用途内部编码单射。标签不是秘密;它的作用是使两种语义无法变成同一个底层查询。协议标识、版本、算法套件、两端身份、方向、阶段、用途及输出长度,应按接口所需写入完整上下文。
本单元的HKDF扩展info固定为
E(protocol, version, suite, client_id, server_id, direction, purpose, u16(L), transcript_hash)。
方向用 c2s、s2c,用途用 finished、application 等。字段顺序不可随本机身份交换:两端对同一c2s流都使用规范的client在前、server在后。
直觉
域分离让同一底层秘密管理几套带名称的独立工作台。它不是“先派生几次便会不同”;相同确定函数收到完全相同输入就必须返回相同结果。如果两个用途只存在于程序变量名里、没有进入实际info,两次调用仍是同一次密码查询。
方向与角色也不等同“我”和“对方”。客户端的发送是服务端的接收;若双方都写 send,他们反而会得到不同约定或错误复用。应使用协议全局可辨认的方向名称。
例子与边界
把PRF换成理想随机函数
这个证明要求输入域确实不相交。若用裸字符串拼接,标签 ab 配输入 c 与标签 a 配输入 bc 仍会相撞;标签数量再多也无济于事。若直接删掉方向字段,固定其他info与PRK之后,c2s与s2c的密钥将严格相等,不是只发生一次罕见碰撞。
反过来,即使域编码不同,有限长度随机输出仍可能偶然相同。对
会话实验比较方向和用途改变后的真实派生字节,并删除方向构造完全相同的info。该反例直接否定的是“方向密钥独立/分离”接口;若记录AAD仍核对方向,不能因此声称已经成功反射记录。攻击需要看还有哪些独立校验门保留。
推论与应用
域分离使协议组合的资源账本更清楚:相同PRK下的应用密钥、Finished密钥、导出材料各有固定接口。它不能替代密钥保密、正确随机源或独立的证明;也不能把弱源变成高熵源。
标签更新应是协议定义的一部分。改变版本却沿用旧标签,可能使跨版本字节被认可;反之,仅把接收到的版本字段照抄进KDF,而不检查本机允许的版本,也没有建立协商策略。接收者必须验证自己期望的语义,再使用对应标签。