【问题标题】:SignatureValue calculation for XML-DSIGXML-DSIG 的 SignatureValue 计算
【发布时间】: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 的方法以及如何填充它...

【问题讨论】:

    标签: hash xml-dsig


    【解决方案1】:

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

    • 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 和哈希值。

    【讨论】:

    • 谢谢。似乎 RSACryptoServiceProvider.SignHash() 和 RSAPKCS1SignatureFormatter.CreateSignature() 在 PKCS1 v1.5 中创建签名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多