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