【发布时间】:2015-02-19 10:12:27
【问题描述】:
我正在尝试使用 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 |法* | 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 字节必须 重复最大次数,使得 加密的数量比 RSA 模数短一个八位字节。
换句话说,如果我有某个 XML 元素的 hash 值(不是用 base64 编码的,对吗?),在将它发送到 SignHash(在 RSACryptoServiceProvider 中)函数? 我知道它在文本中,但我很难理解它。 我根本不理解“CRYPT (PAD (ASN.1 (OID, DIGEST (data))))”,虽然我理解其中的一部分......我不明白获取 OID 和 ASN 的方法以及如何填充它...
【问题讨论】: