“本页已规定Encode必须无歧义,并说明上下文可由AAD或KDF绑定。协议字段编码把这项要求展开为编码/解析往返、规范字节、资源上限与单射证明;域分离再给出互不相交输入域的随机函数论证。多记…”
形式陈述
密码算法处理字节串,而应用处理“版本、身份、消息类型”等有意义的字段。先固定一个合法元组集合
本单元的教学编码先写两字节大端无符号字段数
这里
解析时先验证输入中还有完整长度字,再检查长度不超过上限与剩余字节数,才读取字段;最后要求全部输入被消费。整数加法不得溢出。真实流式解析还需要总帧长度与缓冲预算,不能仅因长度前缀是32位就准许分配4 GiB。
直觉
签名或MAC只能承诺它实际收到的字节。若两个不同的业务请求在编码阶段已经变成同一字节串,后面使用再强的哈希也无法区分它们。这不是找到了密码哈希碰撞,而是应用自己丢失了边界。
长度前缀相当于给每个盒子写上尺寸;类型和消息阶段则告诉接收者盒子里应该是什么。只有尺寸、没有固定字段含义,仍可能把“发送者”误作“接收者”。因此编码合同与协议解释合同都要明确。
例子与边界
裸拼接把 abc。教学编码分别是:
0002 00000002 6162 00000001 630002 00000001 61 00000002 6263
空格只为阅读,不是线上字节。第一个串先声明两个字段,再读取长度2与长度1;第二个依次读取1与2,所以解析结果不同。空字段也合法但不等于缺字段:
证明往返时,读取计数得到同一个
只保留最后一字节之前的前缀必须拒绝;给合法串追加 00 也必须拒绝。若前端忽略尾随字节而签名检查使用完整串,或两端对重复JSON键采用不同优先级,双方可能认证相同输入却执行不同对象。Unicode归一化、大小写和数字表示应在规格中决定;不能在验证后临时“清理”成另一种语义。
推论与应用
握手 transcript、KDF info、签名上下文与AEAD关联数据都可以复用这项编码接口,但每种消息必须有自己的域或类型标签。编码提供确定的对象边界,不提供保密、认证、随机性或安全版本协商。
会话实验中的 enc/dec 用本规格检查往返、两种 abc 元组、截断和尾随输入。有限测试用来查实现错误;上面的归纳论证才解释任意合法字段序列为什么不会混淆。生产协议通常已有成熟编码,不能为使用本例而私自替换线上格式。
设字段数为n、总payload长度为m,采用一次汇集或线性缓冲器,编码与完整复制解析需