跳到主要内容

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).