8. 哈希套件 (Suites for Hashing)
本节列出了用于哈希到标准椭圆曲线的推荐套件。
哈希到曲线套件完全指定了将字节串哈希到特定椭圆曲线群上的点的过程。第 8.1 节描述了如何实现套件。需要哈希到椭圆曲线的应用程序应使用现有套件或按照第 8.9 节所述指定新套件。
使用哈希到曲线套件的所有应用程序必须 (MUST) 根据第 3.1 节中的指南选择域分离标签 (DST)。此外,安全性要求返回目标曲线上均匀随机点的随机预言机的应用程序必须 (MUST) 使用编码类型为 hash_to_curve 的套件;有关更多信息,请参见第 3 节和下文。
哈希到曲线套件包含以下参数:
- Suite ID:用于引用给定套件的短名称。第 8.10 节讨论了 Suite ID 的命名约定。
- 编码类型 (encoding type):均匀 (hash_to_curve) 或非均匀 (encode_to_curve)。有关这些编码类型的定义,请参见第 3 节。
- E:在域 F 上的目标椭圆曲线。
- p:域 F 的特征。
- m:域 F 的扩展次数。如果 m > 1,套件还必须 (MUST) 指定用于表示扩展域元素的多项式基。
- k:套件的目标安全级别(以位为单位)。(有关讨论,请参见第 10.8 节。)
- L:hash_to_field 的长度参数(第 5 节)。
- expand_message:第 5.3 节中指定的变体之一加上指定变体所需的任何参数(例如 H,基础哈希函数)。
- f:来自第 6 节的映射函数。
- h_eff:clear_cofactor 的标量参数(第 7 节)。
除了上述参数外,映射 f 可能需要额外的参数 Z、M、rational_map、E' 或 iso_map。如适用,必须 (MUST) 指定这些参数。
下表列出了某些椭圆曲线的推荐套件。相应的参数在以下小节中给出。
| E | 套件 | 章节 | |==============|===================================|======| | NIST P-256 | P256_XMD:SHA-256_SSWU_RO_ | 8.2 | | | P256_XMD:SHA-256_SSWU_NU_ | | | NIST P-384 | P384_XMD:SHA-384_SSWU_RO_ | 8.3 | | | P384_XMD:SHA-384_SSWU_NU_ | | | NIST P-521 | P521_XMD:SHA-512_SSWU_RO_ | 8.4 | | | P521_XMD:SHA-512_SSWU_NU_ | | | curve25519 | curve25519_XMD:SHA-512_ELL2_RO_ | 8.5 | | | curve25519_XMD:SHA-512_ELL2_NU_ | | | edwards25519 | edwards25519_XMD:SHA-512_ELL2_RO_ | 8.5 | | | edwards25519_XMD:SHA-512_ELL2_NU_ | | | curve448 | curve448_XOF:SHAKE256_ELL2_RO_ | 8.6 | | | curve448_XOF:SHAKE256_ELL2_NU_ | | | edwards448 | edwards448_XOF:SHAKE256_ELL2_RO_ | 8.6 | | | edwards448_XOF:SHAKE256_ELL2_NU_ | | | secp256k1 | secp256k1_XMD:SHA-256_SSWU_RO_ | 8.7 | | | secp256k1_XMD:SHA-256_SSWU_NU_ | | | BLS12-381 G1 | BLS12381G1_XMD:SHA-256_SSWU_RO_ | 8.8 | | | BLS12381G1_XMD:SHA-256_SSWU_NU_ | | | BLS12-381 G2 | BLS12381G2_XMD:SHA-256_SSWU_RO_ | 8.8 | | | BLS12381G2_XMD:SHA-256_SSWU_NU_ | |
表 2:哈希到椭圆曲线的套件
8.1. 实现哈希到曲线套件 (Implementing a Hash-to-Curve Suite)
哈希到曲线套件需要以下函数。请注意,其中一些需要第 4 节中的实用函数。
- 目标椭圆曲线的基域算术运算,例如加法、乘法和平方根。
- 目标曲线的椭圆曲线点运算,例如点加法和标量乘法。
- hash_to_field 函数;见第 5 节。这包括 expand_message 变体(第 5.3 节)和任何组成的哈希函数或 XOF。
- 套件指定的映射函数;见第 6 节的相应小节。
- 清除余因子函数;见第 7 节。这可以实现为标量乘以 h_eff 或更快的等效方法。
- 所需的编码函数;见第 3 节。这是 hash_to_curve 或 encode_to_curve。
8.2. NIST P-256 套件
本节定义 NIST P-256 椭圆曲线 [FIPS186-4] 的密码套件。
P256_XMD:SHA-256_SSWU_RO_ 定义如下:
- 编码类型:hash_to_curve(第 3 节)
- E: y^2 = x^3 + A * x + B,其中 A = -3,B = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
- p: 2^256 - 2^224 + 2^192 + 2^96 - 1
- m: 1
- k: 128
- expand_message: expand_message_xmd(第 5.3.1 节)
- H: SHA-256
- L: 48
- f: 简化 SWU 方法(第 6.6.2 节)
- Z: -10
- h_eff: 1
P256_XMD:SHA-256_SSWU_NU_ 与 P256_XMD:SHA-256_SSWU_RO_ 相同,除了编码类型为 encode_to_curve(第 3 节)。
8.3-8.8. 其他曲线套件
类似地定义了以下曲线的套件:
- 8.3: NIST P-384(使用 SHA-384)
- 8.4: NIST P-521(使用 SHA-512)
- 8.5: curve25519 和 edwards25519(使用 SHA-512)
- 8.6: curve448 和 edwards448(使用 SHAKE256)
- 8.7: secp256k1(使用 SHA-256)
- 8.8: BLS12-381 G1 和 G2(使用 SHA-256)
每个套件都指定了适当的参数,包括曲线方程、域特征、安全级别、映射函数和清除余因子方法。
8.9. 定义新的哈希到曲线套件 (Defining a New Hash-to-Curve Suite)
对于本节第 8 节中未列出的椭圆曲线,可以通过以下方式定义新的哈希到曲线套件:
- E、F、p 和 m 由椭圆曲线及其基域确定。
- k 是套件的目标安全级别的上限(第 10.8 节)。合理的 k 选择是 ceil(log2(r) / 2),其中 r 是曲线 E 的子群 G 的阶(第 2.1 节)。
- 选择编码类型,hash_to_curve 或 encode_to_curve(第 3 节)。
- 按照第 5 节中的描述计算 L。
- 从第 5.3 节中选择 expand_message 变体以及任何基础密码学原语(例如哈希函数 H)。
- 按照第 6.1 节中的指南选择映射并为该映射选择任何所需的参数。
- 选择 h_eff 为 E 的余因子,或者如果要使用快速余因子清除方法,则选择适合该方法的值,如第 7 节所述。
- 按照第 8.10 节中的指南构造 Suite ID。
8.10. Suite ID 命名约定 (Suite ID Naming Conventions)
Suite ID 必须 (MUST) 按如下方式构造:
CURVE_ID || "_" || HASH_ID || "_" || MAP_ID || "_" || ENC_VAR || "_"
字段 CURVE_ID、HASH_ID、MAP_ID 和 ENC_VAR 是 ASCII 编码的字符串,每个最多 64 个字符。字段必须 (MUST) 仅包含 0x21 到 0x7E(包括)之间的 ASCII 字符,除了不允许使用下划线(即 0x5F)。
如上所示,每个字段(包括最后一个)后面都跟一个下划线("_",ASCII 0x5F)。这有助于确保 Suite ID 是前缀自由的。Suite ID 必须 (MUST) 包含最终的下划线,并且不得 (MUST NOT) 在最终的下划线之后包含任何字符。
Suite ID 字段必须 (MUST) 按如下方式选择:
- CURVE_ID:目标椭圆曲线的人类可读表示。
- HASH_ID:expand_message 函数和 hash_to_field 中使用的任何基础哈希原语的人类可读表示(第 5 节)。
- MAP_ID:第 6 节中定义的 map_to_curve 函数的人类可读表示。
- ENC_VAR:表示编码类型和其他信息的字符串。
有关详细的命名约定和示例,请参见原始 RFC 9380 文档。