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,用于清除余因子(第 7 节)的标量参数。
除了上述参数外,映射 f 可能还需要额外的参数 Z、M、rational_map、E' 或 iso_map。在适用时,MUST 加以指定。
下表列出了针对某些椭圆曲线 RECOMMENDED 的套件。相应参数在接下来的各小节中给出。其安全性分析依赖于输出具有均匀分布点的随机预言机的密码学协议,MUST NOT 使用非均匀编码。此外,使用非均匀编码的应用 SHOULD 仔细分析非均匀性带来的安全影响。当所需编码不明确时,应用 SHOULD 出于安全考虑使用均匀编码。
| E | 套件 (Suites) | 小节 |
|---|---|---|
| NIST P-256 | P256_XMD:SHA-256_SSWU_RO_ P256_XMD:SHA-256_SSWU_NU_ | 8.2 |
| NIST P-384 | P384_XMD:SHA-384_SSWU_RO_ P384_XMD:SHA-384_SSWU_NU_ | 8.3 |
| NIST P-521 | P521_XMD:SHA-512_SSWU_RO_ P521_XMD:SHA-512_SSWU_NU_ | 8.4 |
| curve25519 | curve25519_XMD:SHA-512_ELL2_RO_ curve25519_XMD:SHA-512_ELL2_NU_ | 8.5 |
| edwards25519 | edwards25519_XMD:SHA-512_ELL2_RO_ edwards25519_XMD:SHA-512_ELL2_NU_ | 8.5 |
| curve448 | curve448_XOF:SHAKE256_ELL2_RO_ curve448_XOF:SHAKE256_ELL2_NU_ | 8.6 |
| edwards448 | edwards448_XOF:SHAKE256_ELL2_RO_ edwards448_XOF:SHAKE256_ELL2_NU_ | 8.6 |
| secp256k1 | secp256k1_XMD:SHA-256_SSWU_RO_ secp256k1_XMD:SHA-256_SSWU_NU_ | 8.7 |
| BLS12-381 G1 | BLS12381G1_XMD:SHA-256_SSWU_RO_ BLS12381G1_XMD:SHA-256_SSWU_NU_ | 8.8 |
| BLS12-381 G2 | BLS12381G2_XMD:SHA-256_SSWU_RO_ BLS12381G2_XMD:SHA-256_SSWU_NU_ | 8.8 |
表 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 的套件 (Suites for 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 = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e2 7d2604b
-
-
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:Simplified 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 节)。
针对 P-256 的 Simplified SWU 映射的优化示例实现见附录 F.2。
8.3. NIST P-384 的套件 (Suites for NIST P-384)
本节定义 NIST P-384 椭圆曲线 [FIPS186-4] 的密码套件。
P384_XMD:SHA-384_SSWU_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:y^2 = x^3 + A * x + B,其中
-
A = -3
-
B = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5 013875ac656398d8a2ed19d2a85c8edd3ec2aef
-
-
p:2^384 - 2^128 - 2^96 + 2^32 - 1
-
m:1
-
k:192
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-384
-
L:72
-
f:Simplified SWU 方法(第 6.6.2 节)
-
Z:-12
-
h_eff:1
P384_XMD:SHA-384_SSWU_NU_ 与 P384_XMD:SHA-384_SSWU_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
针对 P-384 的 Simplified SWU 映射的优化示例实现见附录 F.2。
8.4. NIST P-521 的套件 (Suites for NIST P-521)
本节定义 NIST P-521 椭圆曲线 [FIPS186-4] 的密码套件。
P521_XMD:SHA-512_SSWU_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:y^2 = x^3 + A * x + B,其中
-
A = -3
-
B = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b4899 18ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451f d46b503f00
-
-
p:2^521 - 1
-
m:1
-
k:256
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-512
-
L:98
-
f:Simplified SWU 方法(第 6.6.2 节)
-
Z:-4
-
h_eff:1
P521_XMD:SHA-512_SSWU_NU_ 与 P521_XMD:SHA-512_SSWU_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
针对 P-521 的 Simplified SWU 映射的优化示例实现见附录 F.2。
8.5. curve25519 与 edwards25519 的套件 (Suites for curve25519 and edwards25519)
本节定义 curve25519 与 edwards25519 [RFC7748] 的密码套件。注意,当哈希到 ristretto255 [ristretto255-decaf448] 时,MUST NOT 使用这些密码套件。关于如何哈希到该群的信息见附录 B。
curve25519_XMD:SHA-512_ELL2_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:K * t^2 = s^3 + J * s^2 + s,其中
-
J = 486662
-
K = 1
-
-
p:2^255 - 19
-
m:1
-
k:128
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-512
-
L:48
-
f:Elligator 2 方法(第 6.7.1 节)
-
Z:2
-
h_eff:8
edwards25519_XMD:SHA-512_ELL2_RO_ 与 curve25519_XMD:SHA-512_ELL2_RO_ 完全相同,但以下参数除外:
-
E:a * v^2 + w^2 = 1 + d * v^2 * w^2,其中
-
a = -1
-
d = 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca1 35978a3
-
-
f:Twisted Edwards Elligator 2 方法(第 6.8.2 节)
-
M:curve25519,定义于 [RFC7748] 第 4.1 节
-
rational_map:定义于 [RFC7748] 第 4.1 节的有理映射
curve25519_XMD:SHA-512_ELL2_NU_ 与 curve25519_XMD:SHA-512_ELL2_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
edwards25519_XMD:SHA-512_ELL2_NU_ 与 edwards25519_XMD:SHA-512_ELL2_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
上述映射的优化示例实现见附录 G.2.1 和附录 G.2.2。
8.6. curve448 与 edwards448 的套件 (Suites for curve448 and edwards448)
本节定义 curve448 与 edwards448 [RFC7748] 的密码套件。注意,当哈希到 decaf448 [ristretto255-decaf448] 时,MUST NOT 使用这些密码套件。关于如何哈希到该群的信息见附录 C。
curve448_XOF:SHAKE256_ELL2_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:K * t^2 = s^3 + J * s^2 + s,其中
-
J = 156326
-
K = 1
-
-
p:2^448 - 2^224 - 1
-
m:1
-
k:224
-
expand_message:expand_message_xof(第 5.3.2 节)
-
H:SHAKE256
-
L:84
-
f:Elligator 2 方法(第 6.7.1 节)
-
Z:-1
-
h_eff:4
edwards448_XOF:SHAKE256_ELL2_RO_ 与 curve448_XOF:SHAKE256_ELL2_RO_ 完全相同,但以下参数除外:
-
E:a * v^2 + w^2 = 1 + d * v^2 * w^2,其中
-
a = 1
-
d = -39081
-
-
f:Twisted Edwards Elligator 2 方法(第 6.8.2 节)
-
M:curve448,定义于 [RFC7748] 第 4.2 节
-
rational_map:定义于 [RFC7748] 第 4.2 节的 4-同源映射
curve448_XOF:SHAKE256_ELL2_NU_ 与 curve448_XOF:SHAKE256_ELL2_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
edwards448_XOF:SHAKE256_ELL2_NU_ 与 edwards448_XOF:SHAKE256_ELL2_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
上述映射的优化示例实现见附录 G.2.3 和附录 G.2.4。
8.7. secp256k1 的套件 (Suites for secp256k1)
本节定义 secp256k1 椭圆曲线 [SEC2] 的密码套件。
secp256k1_XMD:SHA-256_SSWU_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:y^2 = x^3 + 7
-
p:2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
-
m:1
-
k:128
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-256
-
L:48
-
f:针对 AB == 0 的 Simplified SWU(第 6.6.3 节)
-
Z:-11
-
E':y'^2 = x'^3 + A' * x' + B',其中
-
A':0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01 a444533
-
B':1771
-
-
iso_map:附录 E.1 给出的从 E' 到 E 的 3-同源映射
-
h_eff:1
secp256k1_XMD:SHA-256_SSWU_NU_ 与 secp256k1_XMD:SHA-256_SSWU_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
针对与 secp256k1 同源的曲线 E' 的 Simplified SWU 映射的优化示例实现见附录 F.2。
8.8. BLS12-381 的套件 (Suites for BLS12-381)
本节定义 BLS12-381 椭圆曲线 [BLS12-381] 的群 G1 与 G2 的密码套件。
8.8.1. BLS12-381 G1
BLS12381G1_XMD:SHA-256_SSWU_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:y^2 = x^3 + 4
-
p:0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f 6241eabfffeb153ffffb9feffffffffaaab
-
m:1
-
k:128
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-256
-
L:64
-
f:针对 AB == 0 的 Simplified SWU(第 6.6.3 节)
-
Z:11
-
E':y'^2 = x'^3 + A' * x' + B',其中
-
A' = 0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aef d881ac98936f8da0e0f97f5cf428082d584c1d
-
B' = 0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14f cef35ef55a23215a316ceaa5d1cc48e98e172be0
-
-
iso_map:附录 E.2 给出的从 E' 到 E 的 11-同源映射
-
h_eff:0xd201000000010001
BLS12381G1_XMD:SHA-256_SSWU_NU_ 与 BLS12381G1_XMD:SHA-256_SSWU_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
注意,这些套件的 h_eff 取值是为了与 Scott 所描述的快速清除余因子方法兼容([WB19] 第 5 节)。
针对与 BLS12-381 G1 同源的曲线 E' 的 Simplified SWU 映射的优化示例实现见附录 F.2。
8.8.2. BLS12-381 G2
BLS12381G2_XMD:SHA-256_SSWU_RO_ 定义如下:
-
编码类型:hash_to_curve(第 3 节)
-
E:y^2 = x^3 + 4 * (1 + I)
-
基域 F 为 GF(p^m),其中
-
p:0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6 b0f6241eabfffeb153ffffb9feffffffffaaab
-
m:2
-
(1, I) 是 F 的基,且在 F 中 I^2 + 1 == 0
-
-
k:128
-
expand_message:expand_message_xmd(第 5.3.1 节)
-
H:SHA-256
-
L:64
-
f:针对 AB == 0 的 Simplified SWU(第 6.6.3 节)
-
Z:-(2 + I)
-
E':y'^2 = x'^3 + A' * x' + B',其中
-
A' = 240 * I
-
B' = 1012 * (1 + I)
-
-
iso_map:附录 E.3 给出的从 E' 到 E 的同源映射
-
h_eff:0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff0315 08ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689 f6a359894c0adebbf6b4e8020005aaa95551
BLS12381G2_XMD:SHA-256_SSWU_NU_ 与 BLS12381G2_XMD:SHA-256_SSWU_RO_ 完全相同,只是其编码类型为 encode_to_curve(第 3 节)。
注意,这些套件的 h_eff 取值是为了与 Budroni 和 Pintore 所描述的快速清除余因子方法兼容([BP17] 第 4.1 节),并在附录 G.3 中加以汇总。
针对与 BLS12-381 G2 同源的曲线 E' 的 Simplified SWU 映射的优化示例实现见附录 F.2。
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 均为最多 64 个字符的 ASCII 编码字符串。字段 MUST 仅包含 0x21 至 0x7E(含)之间的 ASCII 字符,但下划线(即 0x5F)除外。
如上所示,每个字段(包括最后一个)后都跟随一个下划线("_" ,ASCII 0x5F)。这有助于确保 Suite ID 是无前缀的(prefix free)。Suite ID MUST 包含末尾的下划线,且 MUST NOT 在末尾下划线之后包含任何字符。
Suite ID 字段 MUST 按下述方式选择:
-
CURVE_ID:目标椭圆曲线的人类可读表示。
-
HASH_ID:expand_message 函数以及 hash_to_field(第 5 节)中使用的任何底层哈希原语的人类可读表示。该字段 MUST 按如下方式构造:
EXP_TAG || ":" || HASH_NAME
EXP_TAG 指示 expand_message 变体:
-
"XMD" 表示 expand_message_xmd(第 5.3.1 节)。
-
"XOF" 表示 expand_message_xof(第 5.3.2 节)。
HASH_NAME 是底层哈希原语的人类可读名称。例如:
-
对于使用 SHAKE128 的 expand_message_xof(第 5.3.2 节),HASH_ID 为 "XOF:SHAKE128"。
-
对于使用 SHA3-256 的 expand_message_xmd(第 5.3.1 节),HASH_ID 为 "XMD:SHA3-256"。
使用满足第 5.1 节要求的替代 hash_to_field 函数的套件,MUST 通过将标识该函数的标签以冒号(":" ,ASCII 0x3A)分隔,追加到 HASH_ID 字段中来加以指示。
-
-
MAP_ID:第 6 节所定义的 map_to_curve 函数的人类可读表示。定义如下:
-
"SVDW" 表示 Shallue 和 van de Woestijne(第 6.6.1 节)。
-
"SSWU" 表示 Simplified SWU(第 6.6.2 节和第 6.6.3 节)。
-
"ELL2" 表示 Elligator 2(第 6.7.1 节和第 6.8.2 节)。
-
-
ENC_VAR:一个指示编码类型及其他信息的字符串。该字符串的前两个字符指示该套件表示 hash_to_curve 还是 encode_to_curve 操作(第 3 节),如下:
-
如果 ENC_VAR 以 "RO" 开头,该套件使用 hash_to_curve。
-
如果 ENC_VAR 以 "NU" 开头,该套件使用 encode_to_curve。
-
ENC_VAR MUST NOT 以任何其他字符串开头。
ENC_VAR MAY 也用于编码其他用于标识变体的信息,例如版本号。RECOMMENDED 的做法是添加一个或多个以冒号分隔的子字段。例如,"RO:V02" 是均匀编码套件第二个版本的合适 ENC_VAR 值,而 "RO:V02:FOO01:BAR17" 可能用于指示该套件的一个变体。
-