对不起我的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中,由于它的简单)?
答案 0 :(得分:1)
security.stackexchange.com answer有很好的细节,但这是简短的形式(因为他们似乎完全回答你的问题。
第一步是EMSA-PKCS1-v1_5,其中M
是(未散列)消息,emLen
是RSA密钥的大小(以字节为单位)(通常以位表示)
H
= Hash(M)
。我们知道Hash
是SHA-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的工作方式更为不同。