C# 在C中对XML文件进行签名和验证#

C# 在C中对XML文件进行签名和验证#,c#,.net,xml,xml-signature,C#,.net,Xml,Xml Signature,我试图在一台计算机上对XML进行签名,然后在另一台计算机上验证该XML。我看到有人问这个问题(),但提问者不清楚,也没有找到答案 我使用以下示例对XML文件进行签名和验证: 如果我在同一台计算机上同时运行签名和验证,则验证工作正常。但当我尝试在另一台计算机上验证时,它失败了 在签署文件之前,我创建密钥容器,如下所示: aspnet_iisreg -pc "MY_KEY_CONTAINER" -exp 我对XML进行签名,然后导出密钥(注意这里我没有使用-pri导出私钥): 然后在另一台计算机

我试图在一台计算机上对XML进行签名,然后在另一台计算机上验证该XML。我看到有人问这个问题(),但提问者不清楚,也没有找到答案

我使用以下示例对XML文件进行签名和验证:

如果我在同一台计算机上同时运行签名和验证,则验证工作正常。但当我尝试在另一台计算机上验证时,它失败了

在签署文件之前,我创建密钥容器,如下所示:

aspnet_iisreg -pc "MY_KEY_CONTAINER" -exp
我对XML进行签名,然后导出密钥(注意这里我没有使用-pri导出私钥):

然后在另一台计算机上导入密钥:

aspnet_iisreg -pi "MY_KEY_CONTAINER" "D:\\MY_KEY_CONTAINER.xml"
然后,在第二台计算机上,我运行在第一台计算机上运行的验证应用程序。但是,在第二台计算机上,验证失败。两台机器上的设置相同。两者都运行相同的.net版本

我想确认,我所描述的过程应该有效。如果我的代码没有问题,我上面描述的密钥交换过程是否可以工作


编辑:我开始在屏幕上打印密钥,并意识到即使我删除旧密钥并创建新密钥,应用程序中的密钥也不会改变。似乎有两个不同的密钥容器,尽管它们具有相同的名称。我的应用程序正在访问一个密钥容器,而在运行aspnet_iisreg命令时正在使用另一个密钥容器。这是正确的吗?是什么导致了这种情况,我可以修复它吗?

前面提到的MSDN示例遗漏了创建的签名中的
KeyInfo
结构
KeyInfo
甚至允许您将证书包含在签名文档中,从而使其完全可移植-证书是签名文档的一部分,这意味着在接收方,您不仅可以验证签名,还可以接受或拒绝证书(通常这涉及指纹查找)

我在MSDN文章中也不喜欢的是缺乏理论——有三种类型的签名——封装、封装和分离。区别可能很重要,最好对正在发生的事情有更深入的了解

这就是为什么我编写了一个包含三部分的教程,介绍了可互操作的XMLDsig。我将展示如何以可互操作的方式在C#和Java中创建和验证签名:

第一部分(理论)

第二部分(C)


第3部分(Java)

谢谢,这有助于澄清一些问题。然而,我的问题实际上是关于如何共享公钥,以便可以在另一台计算机上验证XML文件。MSDN示例使用您描述的“evoloped”实现。但是本文没有描述如何分发公钥。我希望能够将公钥放在闪存驱动器上,并将其复制到另一台计算机上,然后在该计算机上验证XML。
aspnet_iisreg -pi "MY_KEY_CONTAINER" "D:\\MY_KEY_CONTAINER.xml"