1. 简介 (Introduction)
许多密码学协议需要一种将任意输入(例如密码)编码为椭圆曲线上一点的过程。这个过程被称为哈希到椭圆曲线 (hashing to an elliptic curve),其中哈希过程提供抗碰撞性,并且不会泄露输出点的离散对数。哈希到椭圆曲线的密码系统的典型例子包括密码认证密钥交换 (password-authenticated key exchanges) [BM92] [J96] [BMP00] [p1363.2]、基于身份的加密 (Identity-Based Encryption) [BF01]、Boneh-Lynn-Shacham 签名 [BLS01] [BLS-SIG]、可验证随机函数 (Verifiable Random Functions) [MRV99] [VRF],以及不经意伪随机函数 (Oblivious Pseudorandom Functions) [NR97] [OPRFs]。
对于实现者而言不幸的是,对于使用特定椭圆曲线实现的特定协议,适合的精确哈希函数往往无法从协议描述中明确得知。与此同时,哈希函数的错误选择可能对安全性造成灾难性后果。
本文档旨在通过为一系列曲线类型提供一套全面的推荐算法来弥合这一差距。每个算法都符合一个通用接口:它接受任意长度的字节串作为输入,并生成椭圆曲线上的一个点作为输出。我们为每个算法提供实现细节,描述每个推荐背后的安全依据,并为未明确覆盖的椭圆曲线提供指导。我们还为这些算法使用的内部函数提供优化实现。
希望快速指定或实现符合标准的哈希函数的读者应参阅第 8 节,其中列出了推荐的哈希到曲线套件 (hash-to-curve suites),并描述了如何实现现有套件以及如何指定新套件。
本文档不指定概率拒绝采样方法 (probabilistic rejection sampling methods),有时被称为"试错递增" (try-and-increment) 或"寻找点" (hunt-and-peck),因为目标是指定可以在常数时间内合理计算的算法。不推荐使用这些概率拒绝方法,因为它们一直是侧信道漏洞的根源。参见 Dragonblood [VR20] 作为实践中此问题的一个示例,以及附录 A 中对拒绝采样方法及其引入的时序侧信道的非正式描述。
本文档代表密码论坛研究组 (Crypto Forum Research Group, CFRG) 的共识。
1.1. 需求表示法 (Requirements Notation)
本文档中的关键词 "MUST" (必须)、"MUST NOT" (不得)、"REQUIRED" (要求)、"SHALL" (应当)、"SHALL NOT" (不应当)、"SHOULD" (应该)、"SHOULD NOT" (不应该)、"RECOMMENDED" (推荐)、"NOT RECOMMENDED" (不推荐)、"MAY" (可以) 和 "OPTIONAL" (可选) 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,当且仅当它们以全大写形式出现时,如此处所示。