C# 使用文档中的公钥验证XML文档

C# 使用文档中的公钥验证XML文档,c#,xml,signature,C#,Xml,Signature,我已成功地将公钥添加到文档的签名中。目标是使用该公钥验证它,而不是使用证书。以下是签名文档中的XML: <KeyValue> <RSAKeyValue> <Modulus>t++UmV1G9ApuI118GdwK0BoxN3tjrxuQHTwKvlFgl6VrcLhMCb5Q2prga8I4HKLvLDr3L4bsrH0k9r6PPppqMpiN/KGdm6eB2uLnWtJXh1PWcnzfHfodYfQP/NAavIo4wSjss0L41c75/

我已成功地将公钥添加到文档的签名中。目标是使用该公钥验证它,而不是使用证书。以下是签名文档中的XML:

<KeyValue> 
 <RSAKeyValue>
   <Modulus>t++UmV1G9ApuI118GdwK0BoxN3tjrxuQHTwKvlFgl6VrcLhMCb5Q2prga8I4HKLvLDr3L4bsrH0k9r6PPppqMpiN/KGdm6eB2uLnWtJXh1PWcnzfHfodYfQP/NAavIo4wSjss0L41c75/CA0x11iDdU4BOdTHGXaFCaNPQ5DLe3LK+6hjZ+fOYMpCd035TYTLo5+/Ttk5eCzr+MHfnWCaCIOUgkbq0OIUQWch2Sc9regIiA9oPPjUmmbqptLfm9wZBHRZZ+7Q4BewxSBBCIFt5yPhCsTZ1fFINV16tGtXTmtgXCagu4NiH7XsyhZhYDrA8CXb31Dn7M/ussNQkGrEQ==
   </Modulus>
   <Exponent>AQAB</Exponent>
 </RSAKeyValue>
</KeyValue>

目前我正在使用证书。我想改为使用公钥。

密钥由私钥和公钥两部分组成。私钥在每次使用证书时都是相同的,并且嵌入到应用程序中(在客户端和服务器代码中),因此不应传输。每次生成证书时都会生成公钥。因此,您需要这两个密钥,并且要进行测试,您需要创建一个公钥,生成一个包含数据的证书,然后反转该过程。好的。两个问题-如何在XML中传输证书?我如何使用该公钥,或者该公钥已经存在于证书中?您希望将证书与应用程序分开发送(如使用电子邮件),这样黑客就无法从应用程序中获取加密的证书和数据。公钥是用于签署证书的密钥。公钥由私钥生成。私钥是在使用随机变量构造密钥类时生成的,该随机变量是构造函数的一部分或来自种子的随机变量(如传递给构造函数的字符串)。jdweng感谢您的时间。所以我真的不需要将公钥附加到XML?出于安全目的,我只需要将证书发送给希望检查发送消息是否正确的用户?请参阅Wiki示例:
        string xmlString = File.ReadAllText(@"C:/Users/GR-002/Desktop/xml_should_fail_validation.xml");
        XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.LoadXml(xmlString);

        X509Certificate2 pubCert = 
            new X509Certificate2(@"C:/Users/GR-002/Documents/DigitalSignature/base64_encoded_certificate.cer");

        Console.WriteLine(ValidateXmlDocumentWithCertificate(doc, pubCert));
    }

    public static bool ValidateXmlDocumentWithCertificate(XmlDocument doc, X509Certificate2 cert)
    {
        try
        {
            SignedXml signedXml = new SignedXml(doc);
            XmlNodeList nodeList = doc.GetElementsByTagName("Signature");
            signedXml.LoadXml((XmlElement)nodeList[0]);
            return signedXml.CheckSignature(cert, true);
        }

        catch { return false; }
    }