SHA-RSA如何运作?

时间:2017-01-11 08:27:16

标签: cryptography rsa sha

对不起我的noob问题,我是这个领域的新手(但我很好奇)。 我找到了一个包含两个字段的XML文件:DATA和SIGNATURE。 DATA是Ascii文本,SIGNATURE是由256个十六进制字符(128字节)组成的SHA1-RSA1024字符串。 我不明白bi怎样才能从数据字段中获得该签名:数据是用RSA详细说明然后用SHA制作的,还是相反的? 我正在学习RSA,我想我应该找到这样的东西:

00 01 FF FF .. FF FF 00 DigestInfo MessageDigest 

但事实并非如此:我的签名数据不包含该字符串。 你能解释一下用来获取签名的程序吗? 你有一个例子的链接(可能在Python中,由于它的简单)?

1 个答案:

答案 0 :(得分:1)

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)和/或长度(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 - 3 FF。对于带有RSA-2048的SHA-1,这意味着序列为218 FF s。

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(概率签名方案))的工作方式完全不同。值得注意的是,DSA和ECDSA的工作方式更为不同。