我正在尝试编写一个方法,该方法使用C++/CLI 中的NET 框架组件( RSACryptoServiceProvider )返回 XMLDSIG 的 XML 元素的签名。请有人用更简单的话解释一下 XMLDSIG 规范(http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/)的这段摘录,因为我的编程和数学背景很少,因此有难以理解这一点 - 或者提供一个真实代码的摘录作为实现这一点的示例?
RSA 签名的 SignatureValue 内容是根据 RFC 2437 [PKCS1,第 8.1.1 节:RSASSA-PKCS1-v1_5 签名方案的签名生成]计算的八位字节字符串的 base64 [MIME] 编码。如 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 摘要,“prefix”是 PKCS1 [RFC 2437] 中要求的 ASN.1 BER SHA1 算法指示符前缀,即 hex 30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 包含此前缀是为了更容易使用标准加密库。FF 字节必须重复最大次数,以使被 CRYPTed 的量的值比 RSA 模数短一个字节。
换句话说,如果我有某个 XML 元素的哈希值(不是用 base64 编码的,对吗?),在将它发送到SignHash(在RSACryptoServiceProvider中)函数之前我该怎么做?我知道它在文本中,但我很难理解它。我根本不理解“CRYPT (PAD (ASN.1 (OID, DIGEST (data))))”,虽然我理解其中的一部分......我不明白获取 OID 和 ASN 的方法以及如何填充它...