0

我需要在httpwebrequestGET/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);

这个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 密钥。那么它是如何解密的,是否需要和密钥才能解密。这种解密是否也适用于其他机器。

4

1 回答 1

1

存在几种加密方法。

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

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

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

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

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

于 2013-04-12T14:57:10.230 回答