跳到主要内容

3. 将字节串编码到椭圆曲线 (Encoding Byte Strings to Elliptic Curves)

本节给出将字节串编码到椭圆曲线上某点的一般框架与接口。本节中的构造依赖于三个基本函数:

  • 函数 hash_to_field 将任意长度的字节串哈希为一个有限域 F 中的一个或多个元素的列表;其实现定义于第 5 节。
hash_to_field(msg, count)

Input:
- msg, 包含待哈希消息的字节串。
- count, 要输出的 F 的元素个数。

Output:
- (u_0, ..., u_(count - 1)), 一个域元素列表。

Steps: 定义于第 5 节。
  • 函数 map_to_curve 从 E 所定义的有限域 F 的一个元素计算出椭圆曲线 E 上的一点。第 6 节描述了一系列曲线族的映射。
map_to_curve(u)

Input: u, 域 F 的一个元素。
Output: Q, 椭圆曲线 E 上的一点。
Steps: 定义于第 6 节。
  • 函数 clear_cofactor 将曲线 E 上的任意点发送到 E 的子群 G。第 7 节描述执行该操作的方法。
clear_cofactor(Q)

Input: Q, 椭圆曲线 E 上的一点。
Output: P, G 中的一点。
Steps: 定义于第 7 节。

本节定义的两个编码(第 2.2.2 节)具有相同的接口,并且都是随机预言机编码(第 2.2.3 节)。两者都实现为上述三个基本函数的组合。两者的区别在于它们的输出采样自不同的分布:

  • encode_to_curve 是一个从字节串到 G 中点的非均匀编码。也就是说,其输出的分布并不是在 G 上均匀随机的:encode_to_curve 的可能输出集合仅仅是 G 中点的一部分,并且该集合中的某些点比其他点更有可能被输出。第 10.4 节给出了 encode_to_curve 输出分布更精确的定义。
encode_to_curve(msg)

Input: msg, 任意长度的字节串。
Output: P, G 中的一点。

Steps:
1. u = hash_to_field(msg, 1)
2. Q = map_to_curve(u[0])
3. P = clear_cofactor(Q)
4. return P
  • hash_to_curve 是一个从字节串到 G 中点的均匀编码。也就是说,其输出的分布在统计上接近于 G 上的均匀分布。

当使用第 6 节描述的任意 map_to_curve 函数实例化时,该函数适用于大多数需要一个返回 G 中点的随机预言机的应用。进一步讨论见第 10.1 节。

hash_to_curve(msg)

Input: msg, 任意长度的字节串。
Output: P, G 中的一点。

Steps:
1. u = hash_to_field(msg, 2)
2. Q0 = map_to_curve(u[0])
3. Q1 = map_to_curve(u[1])
4. R = Q0 + Q1 # 点的加法 (Point addition)
5. P = clear_cofactor(R)
6. return P

第 8 节中的每个哈希到曲线套件(hash-to-curve suite),都是针对特定椭圆曲线对上述编码函数之一进行实例化。

3.1. 域分离要求 (Domain Separation Requirements)​

本文档中定义的编码函数的所有用法 MUST 包含域分离(第 2.2.5 节),以避免干扰其他使用类似功能的场合。

实例化多个相互独立的 hash_to_curve 或 encode_to_curve 实例的应用,MUST 在这些实例之间强制进行域分离。这一要求既适用于多个实例针对同一条曲线的情况,也适用于多个实例针对不同曲线的情况。(这是因为内部的 hash_to_field 原语(第 5 节)需要域分离以保证输出的独立性。)

域分离通过域分离标签(DST)来强制实施,该标签是一个根据以下要求构造的字节串:

  1. 标签 MUST 作为 DST 参数提供给 hash_to_field,如第 5 节所述。

  2. 标签 MUST 具有非零长度。RECOMMENDED 最小长度为 16 字节,以降低与其他应用发生碰撞的可能性。

  3. 标签 SHOULD 以一个对应用而言唯一的固定标识字符串开头。

  4. 标签 SHOULD 包含一个版本号。

  5. 对于定义了多个密码套件(ciphersuite)的应用,每个套件的标签 MUST 不同。为此,RECOMMENDED 在每个标签中包含套件标识符。

  6. 对于使用多个编码(无论是针对同一条曲线还是不同曲线)的应用,每个编码 MUST 使用不同的标签。为此,RECOMMENDED 在域分离标签中包含该编码的 Suite ID(第 8 节)。对于基于同一套件的独立编码,每个标签 SHOULD 还应包含一个不同的标识符,例如 "ENC1" 和 "ENC2"。

作为一个例子,考虑一个名为 Quux 的虚构应用,它定义了多个不同的密码套件,每个套件对应不同的曲线。一个合理的标签选择是 "QUUX-V-CS-",其中 和 是两位数字,分别指示版本号和套件号,而 是套件 中所用编码的 Suite ID。

作为另一个例子,考虑一个名为 Baz 的虚构应用,它要求对同一曲线有两个独立的随机预言机。这两个预言机的合理标签选择分别是 "BAZ-V-CS--ENC1" 和 "BAZ-V-CS--ENC2",其中 、 和 如上所述。

上面给出的示例标签假定为不带空终止符的 ASCII 编码字节串,这是 RECOMMENDED 的格式。也可以使用其他编码,但在所有情况下,作为字节序列的编码 MUST 被无歧义地指定。