SHA-RSA 是如何工作的?

How SHA-RSA works?

抱歉我的菜鸟问题,我是这个领域的新手(但我很好奇)。 我找到了一个包含两个字段的 xml 文件:DATA 和 SIGNATURE。 DATA 是 Ascii 文本,SIGNATURE 是由 256 个十六进制字符(128 字节)组成的 SHA1-RSA1024 字符串。 我不明白 bi 如何从数据字段中获得该签名:数据是先用 RSA 再用 SHA 详细说明的,还是相反? 我正在研究 RSA,我想我应该找到这样的东西:

00 01 FF FF .. FF FF 00 DigestInfo MessageDigest 

但事实并非如此:我的签名数据不包含该字符串。 你能解释一下获得签名的程序吗? 您是否有带示例的 link(由于其简单性,可能在 Python 中)?

security.stackexchange.com answer 有相当详细的内容,但这是简短的形式(因为它们似乎 相当 回答你的问题。

第一步是 EMSA-PKCS1-v1_5,其中 M 是(未散列的)消息,emLen 是 RSA 密钥的大小(以字节为单位)(通常表示为位)。

H = Hash(M)。我们知道 HashSHA-1(通过问题),所以输出是 20 个字节。假设它产生了 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.

构造T:

// DigestInfo = SEQUENCE(AlgorithmIdentifier, OCTET STRING)
30 21
   // AlgorithmIdentifier = SEQUENCE(OBJECT IDENTIFIER, ANY)
   30 09
      // OBJECT IDENTIFIER(SHA1) => OBJECT IDENTIFIER(1.3.14.3.2.26)
      06 05 2B 0E 03 02 1A
      // NULL (SHA-1 has no parameters)
      05 00
   // OCTET STRING(H)
   04 14 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

由于此结构中的所有内容均具有固定值 (SHA-1 OID) and/or 长度(H=20 字节)T 只是 (30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 concat H)(对于 SHA -1).

假设我们有一个 2048 位密钥(256 字节)。由于 tLen=35,emLen > tLen + 11,所以我们可以继续。

现在,构建 PS。是emLen - tLen - 3FF。对于带有 RSA-2048 的 SHA-1,这意味着 218 FFs.

的序列
EM = 00 01 PS 00 T

现在将所有内容粘合在一起,我们得到(对于 SHA-1 和 2048 位密钥)

00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 00 30 21 30
09 06 05 2B 0E 03 02 1A 05 00 04 14 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

如您所见,散列输出在最后仍然可见。 EMSA-PKCS1-v1_5 填充结构似乎是您所期望的。

然后,EM通过RSA私钥公式得到签名:

`signature` = MODPOW(`EM`, `d`, `n`)

由于 signature 的值现在取决于 d(私钥),因此无法给出固定示例。但这最后一步是为什么 a) 它在密码学上是合理的,并且 b) 你再也找不到你的 MessageDigest 签名值中的值。

对于 RSA 签名,签名被验证为

`candidate` = MODPOW(`signature`, `e`, `n`)
return ConstantTimeSequenceEquals(`candidate`, `EM`);

新的 RSA 签名算法 (PSS (Probabilistic Signature Scheme)) 的工作方式完全不同。而且,值得注意的是,DSA 和 ECDSA 的工作方式更加不同。