我正在尝试编写一个方法,使用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的方法以及如何填充它......
答案 0 :(得分:0)
让我试着解释这些组件,看看这是否让你更接近:
但是,我相信signHash - 函数会为您完成所有这些操作,您只需提供OID和哈希值。