3.6. Variants
3.6. Variants (变体)
确定性 (EC)DSA 规范的许多部分是相当任意的, 但出于互操作性原因做出了选择。本节讨论一些可能的变体。
使用的哈希函数 H 在签名生成过程中用于两个不同的目的: 首先处理输入消息, 然后作为 HMAC 的基础 (HMAC 本身也是哈希函数)。在本文档中, 我们规定对这两种用法使用相同的哈希函数。然而, 这不是强制性的; 将不同的函数用于这两个角色是可能的。主要缺点是测试向量不能涵盖所有组合; 使用单一哈希函数简化了互操作性测试。
int2octets 和 bits2octets 的定义导致 rlen 比特的输出 (即 qlen 向上舍入到下一个 8 的倍数), 并且它们在使用时实际上最多只产生 qlen 比特的熵。可以定义相同的函数, 使其输出恰好为 qlen 比特; 然而, 这会使实现稍微复杂一些, 因为许多编程语言和框架倾向于在八位字节的序列上工作, 而不是比特的序列。另一方面, 舍入 qlen 最多增加 7 比特, 这在 PRNG 种子的上下文中可以忽略不计。
在这个规范中, 我们规定了一个在特殊情况下循环的过程, 其中 k (从 T 通过 bits2int 获得) 不在适当的范围内, 或者将导致为 r 生成零值。然而, 这两种情况实际上从未发生。后一种情况 (计算的 r 为零) 可能仅由于软件错误而发生 (例如, 椭圆曲线参数在程序运行时被损坏)。因此, 实现可能会选择将此类情况简单地视为不可恢复的错误, 并简单地中止签名计算, 而不是循环。