5. 哈希到有限域 (Hashing to a Finite Field)
hash_to_field 函数将任意长度的字节串 msg 哈希为域 F 的一个或多个元素。此函数分两步工作:首先哈希输入字节串以产生均匀随机字节串,然后将此字节串解释为 F 的一个或多个元素。
对于第一步,hash_to_field 调用辅助函数 expand_message。本文档定义了 expand_message 的两个变体:一个适用于 SHA-2 [FIPS180-4] 或 SHA-3 [FIPS202] 等哈希函数,另一个适用于可扩展输出函数如 SHAKE128 [FIPS202]。每个 expand_message 变体的安全考虑将在下文讨论(第 5.3.1 节和第 5.3.2 节)。
实现者不得 (MUST NOT) 使用拒绝采样来生成 F 的均匀随机元素,以确保 hash_to_field 函数适合常数时间实现。原因是拒绝采样过程难以在常数时间内实现,后来善意的"优化"可能会默默地使实现变为非常数时间。这意味着任何基于拒绝采样的 hash_to_field 函数都将与常数时间实现不兼容。
hash_to_field 函数也适用于安全地哈希到标量。例如,当哈希到素数阶为 r 的椭圆曲线(子)群的标量域时,只需用目标域 GF(r) 实例化 hash_to_field 即可。
5.1. 扩展域中的效率考虑 (Efficiency Considerations in Extension Fields)
本节描述的 hash_to_field 函数对某些扩展域效率较低。具体来说,当哈希到扩展域 GF(p^m) 的元素时,hash_to_field 需要将 msg 扩展为 m * L 字节(L 如上所定义)。对于 log2(p) 显著小于安全级别 k 的扩展域,这种方法效率低下。在这种情况下,应用程序可以 (MAY) 使用替代的 hash_to_field 函数,前提是它满足以下安全要求:
- 该函数必须 (MUST) 输出一个或多个域元素,这些元素是均匀随机的,偏差最多为 2^-k。
- 该函数不得 (MUST NOT) 使用拒绝采样。
- 该函数应该 (SHOULD) 适合直线实现。
5.2. hash_to_field 实现 (hash_to_field Implementation)
以下过程实现 hash_to_field。
expand_message 参数必须 (MUST) 符合第 5.3 节给出的要求。第 3.1 节讨论了构造 DST(域分离标签)的必需方法。请注意,如果 expand_message 失败,hash_to_field 可能会失败(ABORT)。
hash_to_field(msg, count)
参数 (Parameters):
- DST,域分离标签(见第 3.1 节)。
- F,特征为 p、阶为 q = p^m 的有限域。
- p,F 的特征(见上文)。
- m,F 的扩展次数,m >= 1(见上文)。
- L = ceil((ceil(log2(p)) + k) / 8),其中 k 是套件的安全参数(例如 k = 128)。
- expand_message,将字节串和域分离标签扩展为均匀随机字节串的函数(见第 5.3 节)。
输入 (Input):
- msg,包含要哈希的消息的字节串。
- count,要输出的 F 元素的数量。
输出 (Output):
- (u_0, ..., u_(count - 1)),域元素的列表。
步骤 (Steps):
1. len_in_bytes = count * m * L
2. uniform_bytes = expand_message(msg, DST, len_in_bytes)
3. for i in (0, ..., count - 1):
4. for j in (0, ..., m - 1):
5. elm_offset = L * (j + i * m)
6. tv = substr(uniform_bytes, elm_offset, L)
7. e_j = OS2IP(tv) mod p
8. u_i = (e_0, ..., e_(m - 1))
9. return (u_0, ..., u_(count - 1))
5.3. expand_message
expand_message 是生成均匀随机字节串的函数。它接受三个参数:
- msg,包含要哈希的消息的字节串,
- DST,充当域分离标签的字节串,以及
- len_in_bytes,要生成的字节数。
本文档定义了 expand_message 的以下两个变体:
- expand_message_xmd(第 5.3.1 节)适用于广泛的哈希函数,包括 SHA-2 [FIPS180-4]、SHA-3 [FIPS202]、BLAKE2 [RFC7693] 等。
- expand_message_xof(第 5.3.2 节)适用于可扩展输出函数(XOFs),包括 SHAKE [FIPS202] 或 BLAKE2X [BLAKE2X] 系列中的函数。
这些变体应该足以满足绝大多数用例,但也可能有其他变体;第 5.3.4 节讨论了要求。
5.3.1. expand_message_xmd
expand_message_xmd 函数使用输出 b 位的密码哈希函数 H 产生均匀随机字节串。为了安全,H 必须 (MUST) 满足以下要求:
-
H 输出的位数必须 (MUST) 为 b >= 2 * k,其中 k 是目标安全级别(以位为单位),并且 b 必须 (MUST) 能被 8 整除。第一个要求确保 k 位抗碰撞性;第二个确保 expand_message_xmd 输出的均匀性。
-
H 可以 (MAY) 是 Merkle-Damgaard 哈希函数(如 SHA-2)。在这种情况下,当基础压缩函数被建模为随机预言机时,安全性成立 [CDMP05]。(见第 10.6 节讨论。)
-
H 可以 (MAY) 是基于海绵的哈希函数(如 SHA-3 或 BLAKE2)。在这种情况下,当内部函数被建模为随机变换或随机置换时,安全性成立 [BDPV08]。
推荐 (RECOMMENDED) 使用 SHA-2 [FIPS180-4] 和 SHA-3 [FIPS202]。例如,对于 128 位安全级别,b >= 256 位,SHA-256 或 SHA3-256 将是适当的选择。
5.3.2. expand_message_xof
expand_message_xof 函数使用可扩展输出函数(XOF)产生均匀随机字节串。为了安全,H 必须 (MUST) 满足以下要求:
- H 必须 (MUST) 是可扩展输出函数(XOF),并且当内部函数被建模为随机变换或随机置换时,必须 (MUST) 被证明与随机预言机不可区分 [BDPV08]。
推荐 (RECOMMENDED) 使用 SHAKE128 或 SHAKE256 [FIPS202]。
5.3.3. 使用长于255字节的DST (Using DSTs Longer than 255 Bytes)
expand_message 变体定义的 DST 长度最多为 255 字节。对于需要更长 DST 的应用程序,建议计算其哈希值并将结果用作 DST。
5.3.4. 定义其他expand_message变体 (Defining Other expand_message Variants)
定义新的 expand_message 变体的指南在本节中给出。新变体必须 (MUST) 满足以下要求:
- 该函数必须 (MUST) 在合理的密码学假设下被证明与随机预言机不可区分。
- 该函数必须 (MUST) 支持第 5.3 节描述的域分离要求。
- 该函数应该 (SHOULD) 适合常数时间实现。