X509 签名值大小

X509 signatureValue size

问题是如果signatureValue是基于散列的,为什么这么大? 假设签名算法是sha256RSA。 按照下面的步骤是不是应该更小:

  1. tbsCertificate 计算 SHA256 哈希。输出 => 256 位。
  2. 使用 RSA 私钥对 256 位哈希进行签名。输出 => 256 位?

但是如果您看到 signatureValue 的大小,它可能有 2048、4096 [更大?] 位。

签名大小不取决于用于散列签名数据的散列算法。它仅取决于密钥大小。

RSA 签名基于模幂,即 sig = m ^ d mod N,其中:

  • m 是要签名的消息
  • d 私有指数(其大小为 N / 2,即 RSA 2048 为 1024 位)。
  • N 模数
  • sig签名值

对于这样的计算,最终结果是 m ^ d 结果除以模数(大致为 RSA 密钥大小)的余数。 md 是相当大的值,当你一个接一个地供电时,该值将很大,甚至不适合模数长度,这就是为什么使用最后一个 mod 操作.而且你可以看到,没有 "hash" 这样的术语。有时(当使用非常小的值时),结果值大小可能小于模数大小。在这种情况下,将填充签名值以匹配模数长度。

从原始签名可以推断出RSA密钥大小,但无法推断出签名中嵌入的哈希算法,这就是为什么签名包含非对称算法和哈希名称,例如sha256RSA,否则,您将必须在消息中的某处存储哈希算法。由于组合(非对称算法和散列算法)是有限的且非常小,因此为此类组合分配唯一的 OID 就足够了。