C#.NET在一台计算机上加密XML,在其他计算机上加密

时间:2013-04-05 19:02:33

标签: encryption x509 x509certificate2 xml-encryption

我需要在 httpwebrequest 上发送GET/PUT/DELETE/POST条消息。

我的请求正文包含XML。

我需要加密正文XML中的内容,然后解密返回客户端/接收方。

我看到有多种方法可以加密XML。 其中一个是http://msdn.microsoft.com/en-us/library/sb7w85t6.aspx

但我担心的是,接收器应该能够解密它。不同平台上的接收者可能不在.NET框架上。

任何人都可以提出最佳方法。

到目前为止我尝试了什么:

//创建一个新的Rijndael密钥。

            key = new RijndaelManaged();
            // Load an XML document.
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("test.xml");

            // Encrypt the "creditcard" element.
            Encrypt(xmlDoc, "creditcard", key);

            Console.WriteLine("The element was encrypted");

            Console.WriteLine(xmlDoc.InnerXml);

            Decrypt(xmlDoc, key);

            Console.WriteLine("The element was decrypted");

            Console.WriteLine(xmlDoc.InnerXml);

这看起来正在做这项工作。但我担心关键

 key = new RijndaelManaged();
Decrypt(xmlDoc, key);

这是什么密钥,不同机器上的客户端以及不同的框架和不同的技术能否解密此消息?

更新

在我研究了几种加密方法之后,我发现X509Certificate2是最好的加密选项,如果在他们的机器上安装了相同的X509证书,客户端也可以解密它。 我可以找到一个加密的脚本

public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, X509Certificate2 Cert)
        {
            // Check the arguments.   
            if (Doc == null)
                throw new ArgumentNullException("Doc");
            if (ElementToEncrypt == null)
                throw new ArgumentNullException("ElementToEncrypt");
            if (Cert == null)
                throw new ArgumentNullException("Cert");

            XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement;
            // Throw an XmlException if the element was not found. 
            if (elementToEncrypt == null)
            {
                throw new XmlException("The specified element was not found");

            }

            EncryptedXml eXml = new EncryptedXml();

            // Encrypt the element.
            EncryptedData edElement = eXml.Encrypt(elementToEncrypt, Cert);
            EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
        }

如果发现此代码要解密

 public static void Decrypt(XmlDocument Doc)
        {
            // Check the arguments.   
            if (Doc == null)
                throw new ArgumentNullException("Doc");

            // Create a new EncryptedXml object.
            EncryptedXml exml = new EncryptedXml(Doc);

            // Decrypt the XML document.
            exml.DecryptDocument();
        }

我的问题是这个解密方法不是要求和X509键。那么它是如何解密的,它不需要和密钥解密。这种解密是否也适用于其他机器。

1 个答案:

答案 0 :(得分:1)

存在多种加密方法。

对称加密使用相同的密钥来加密和解密数据。 AES加密算法就是这种加密的一个例子。

非对称(基于公钥和私钥)加密使用一对密钥。在此模式下,您使用其公钥加密某人的数据。他使用他的私钥(你没有,也不应该有)来解密为他准备的数据。使用基于证书的PKCS#7 / CMS标准或使用OpenPGP来实现非对称加密。

现在关于XML。您可以使用上述方法之一加密它,就好像它是二进制数据一样。或者您可以使用XMLEnc标准对其进行加密。

使用方式取决于谁决定或要求加密格式和方法。如果是你做出决定,那么决定应该基于双方可以使用哪些功能(库,代码)以及如何管理密钥(PKI比对称密钥更难管理 bit ,但一般来说PKI更安全)。

请注意:我们的SecureBlackbox产品在.NET,Java和其他平台上支持对称和基于证书的加密(二进制,XMLEnc和OpenPGP)。