Skip to main content

3.3. Alternate Description of the Generation of k

3.3. Alternate Description of the Generation of k (k 生成的替代描述)

上一节中描述的过程实际上源自 "HMAC_DRBG" 伪随机数生成器, 在 [SP800-90A] 和 [X9.62] 的附录 D 中描述。使用 [SP800-90A] 中的术语, k 的生成可以描述如下:

a. 使用 HMAC 实例化 HMAC_DRBG, 参数化为与用于处理待签名消息的相同哈希函数 H。实例化参数为:

requested_instantiation_security_strength
将此参数设置为 HMAC_DRBG 实现在使用 H 作为基础哈希函数时将接受的任何值。

prediction_resistance_flag
将此参数设置为 "false"。

personalization_string
将此参数设置为 "Null" (空比特序列)。

entropy_input
使用 int2octets(x) 作为熵串。

nonce
使用 bits2octets(H(m)) 作为 nonce。

请注意, 后两个参数本身不是 HMAC_DRBG 实例化函数的参数; 相反, 这些值在实例化期间从内部 Get_entropy_input 函数请求。对于确定性 (EC)DSA, 我们希望 HMAC_DRBG 使用我们指定的熵串和 nonce 运行, 而不访问实际的熵源。

b. 通过从 HMAC_DRBG 请求 qlen 比特并使用 bits2int 转换将结果比特转换为整数来生成 k 的候选值。重复此步骤, 直到获得非零、小于 q 且适合 (EC)DSA 的值 (参见第 3.4 节)。

请注意, 我们为每个签名生成过程实例化一个新的 HMAC_DRBG 实例。生成比特时没有 "个性化字符串" 和 "附加输入"。HMAC_DRBG 的重新种子函数从未被调用, 无论是外部还是作为内部 HMAC_DRBG 处理的结果。

如上所示, 我们使用私钥的编码作为 "熵串", 使用哈希消息 (通过 bits2octets 截断和扩展) 作为 "nonce"。在 HMAC_DRBG 中, 熵串和 nonce 简单地连接到初始种子中; 因此, "熵" 和 "nonce" 之间的分割是相当任意的。为每个使用 qlen 比特应该与大多数 HMAC_DRBG 实现输入要求兼容。