XML-DSIG的SignatureValue计算

时间:2015-02-19 10:12:28

标签: hash xml-dsig

我正在尝试编写一个方法,使用C ++ / CLI中的.NET框架组件( RSACryptoServiceProvider )为XMLDSIG返回XML元素的签名。可以请一些人用XMLDSIG规范(http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/)用简单的词语解释这段摘录,因为我的编程和数学背景很少,因此无法解决这个问题 - 或者提供一个真实代码的摘录形式作为例子实施了吗?

  

RSA签名的SignatureValue内容是base64 [MIME]   根据RFC 2437计算的八位字节串的编码[PKCS1,section   8.1.1:RSASSA-PKCS1-v1_5签名方案的签名生成]。如EMSA-PKCS1-V1_5-ENCODE功能RFC 2437中所述   [PKCS1,第9.2.1节],输入到签名函数的值必须   包含哈希的预先算法的算法对象标识符   功能,但ASN.1解析器的可用性和识别   签名验证者不需要OID。 PKCS#1 v1.5   表示形式如下:CRYPT(PAD(ASN.1(OID,DIGEST(data))))   请注意,填充的ASN.1将具有以下形式:01 | FF *   | 00 |前缀|哈希在哪里" |"是串联," 01"," FF"," 00"   是相应十六进制值的固定八位字节," hash"是个   SHA1数据摘要,"前缀"是ASN.1 BER SHA1算法   PKCS1 [RFC 2437]中要求的指示符前缀,即十六进制30 21   30 09 06 05 2B 0E 03 02 1A 05 00 04 14包含此前缀   它更容易使用标准的加密库。 FF八位字节必须   重复最大次数,使得该值的值   CRYPT的数量比RSA模数短一个八位字节。

换句话说,如果我有某个XML元素的哈希值(不是在base64中编码,那是吗?),在将它发送给<之前我该怎么办? strong> SignHash (在 RSACryptoServiceProvider 中)功能? 我知道它在文中,但我很难理解它。 我不明白&#34; CRYPT(PAD(ASN.1(OID,DIGEST(数据)))&#34;一点也不错,虽然我理解它的一部分......我不明白获得OID然后ASN的方法以及如何填充它......

1 个答案:

答案 0 :(得分:0)

让我试着解释这些组件,看看这是否让你更接近:

  • DIGEST(data)是您已计算的哈希值
  • OID是表示所使用的哈希算法的全局唯一标识符。对于SHA1,这是1.3.14.3.2.26
  • ANS.1表示OID的ANS.1编码和作为ASN.1序列的哈希值。这意味着引用中列出的十六进制值,后跟实际哈希值。
  • PAD表示将01 FF * 01与ASN.1编码的前缀和散列连接以获得所需的长度(FF *表示重复FF适当的次数,RFC提供详细信息)
  • CRYPT是RSA加密功能

但是,我相信signHash - 函数会为您完成所有这些操作,您只需提供OID和哈希值。