2.4. Signature Generation (签名生成)
2.4. Signature Generation (签名生成)
签名生成使用密码学哈希函数 H 和输入消息 m.消息首先由 H 处理, 产生值 H(m), 这是长度为 hlen 的位序列.通常, H 的选择使得其输出长度 hlen 大致等于 qlen, 因为签名方案的整体安全性将取决于 hlen 和 qlen 中较小的一个; 然而, 相关标准支持 hlen 和 qlen 的所有组合.
然后应用以下步骤:
-
使用
bits2int转换和额外的模归约将 H(m) 转换为模 q 的整数:h = bits2int(H(m)) mod q如
bits2octets描述中所述, 额外的模归约不过是一次条件减法. -
生成一个模 q 的随机值, 称为 k.该值不应为 0; 因此, 它位于 [1, q-1] 范围内.本文档的大部分内容将围绕用于生成 k 的过程展开.在普通 DSA 或 ECDSA 中, k 应该通过随机选择来选择, 该选择以均匀概率从 q-1 个可能值中选择一个值.
-
从 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 (这是一个极其不可能发生的事件).
-
-
计算值 s (模 q):
s = (h+x*r)/k mod q对 (r, s) 是签名.DSA 和 ECDSA 标准本身不涵盖签名的编码方式; 一种常见的方式是使用 DER 编码的 ASN.1 结构 (按顺序排列的两个 INTEGER 的 SEQUENCE, 分别为 r 和 s).