密钥流与消息结合

常见同步流密码根据秘密密钥和规定输入产生伪随机流,再与明文异或得到密文。解密时产生相同位置的密钥流并再次异或,因此双方必须匹配密钥、初始化信息和流位置,而不是只说用了同名算法。

异或结合允许最后只使用所需的部分输出;消息不必仅因内部一次产生一块数据,就补成该内部块的整数倍。网络怎样分包或应用怎样分批调用,是另外的成帧与接口问题,不等同于密码算法内部的输出边界。

参考:[1]

ChaCha20用计数器生成不同输出块

RFC 8439的IETF ChaCha20形式使用256位密钥、32位块计数器和96位nonce。固定密钥和nonce下,算法让块计数器递增,逐次生成并拼接密钥流;nonce区分消息用途,计数器又标出其中的块位置。

密钥流生成可按块组织,也可以边生成边与数据结合,以减少保存完整中间流的内存。实现仍要限制用量和计数范围,不能在计数器回绕后继续把已用过的状态当成全新输出。这里的尺寸是这一规范的选择,不是所有流密码的统一参数。

参考:[1]

不重复密钥流,也不能省略认证

若同一段密钥流被重复用于不同明文,两个密文的异或会暴露相应明文之间的异或关系。RFC 8439因此强调同一密钥下nonce的唯一性;单纯换一个文件名或把相同输入重新调用,并不会产生独立密钥流。

流加密本身不必具有完整性验证。ChaCha20与Poly1305按规范组合可形成认证加密,但ChaCha20单独和完整组合不是同一项服务;是否接受一条消息还应依赖正确的标签验证与协议规则,不能只看解密后字节能否显示。

参考:[1] [2]