Skip to main content

2.4. Signature Generation

2.4. Signature Generation (签名生成)

签名生成使用密码学哈希函数 H 和输入消息 m。消息首先由 H 处理, 产生值 H(m), 这是长度为 hlen 的比特序列。通常, 选择 H 使得其输出长度 hlen 大致等于 qlen, 因为签名方案的整体安全性将取决于 hlen 和 qlen 中的最小值; 然而, 相关标准支持 hlen 和 qlen 的所有组合。

然后应用以下步骤:

  1. 使用 bits2int 转换和额外的模约简将 H(m) 转换为模 q 的整数:

    h = bits2int(H(m)) mod q

    如在 bits2octets 的描述中所述, 额外的模约简不过是一个条件减法。

  2. 生成模 q 的随机值, 称为 k。该值不应为 0; 因此, 它位于 [1, q-1] 范围内。本文档的大部分剩余内容将围绕用于生成 k 的过程展开。在普通 DSA 或 ECDSA 中, k 应通过以均匀概率在 q-1 个可能值中选择一个值的随机选择来选择。

  3. 从 k 和密钥参数计算值 r (模 q):

    • 对于 DSA:

      r = g^k mod p mod q

      (幂运算模 p 执行, 产生 0 和 p-1 之间的数字, 然后进一步对 q 取模。)

    • 对于 ECDSA: 计算点 kG; 其 X 坐标 (定义 E 的域的成员) 转换为整数, 该整数对 q 取模, 产生 r。

    如果 r 结果为零, 则应选择新的 k 并再次计算 r (这是一个极不可能发生的情况)。

  4. 计算值 s (模 q):

    s = (h+x*r)/k mod q

    对 (r, s) 是签名。DSA 和 ECDSA 标准本身并未涵盖签名的编码方式; 一种常见的方式是使用 DER 编码的 ASN.1 结构 (两个 INTEGER 的 SEQUENCE, 按顺序为 r 和 s)。