C#.NET 在一台机器上加密 XML 并在另一台机器上解密

Posted

技术标签:

【中文标题】C#.NET 在一台机器上加密 XML 并在另一台机器上解密【英文标题】:C#.NET Encrypt XML on one machine and Decrypt on other machine 【发布时间】:2013-04-05 19:02:32 【问题描述】:

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

这个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】:

存在多种加密方法。

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

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

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

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

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

【讨论】:

感谢您提供的信息,我的要求是我必须通过 httpwebrequest 传递加密的 XML,并且相同或不同平台的接收器应该能够接收和解密。我发现很难找到最简单的方法,因为这里的发送者是一个,接收者是多个。所有接收者都应该能够解密。你能推荐一个最好的方法吗? @Habo 正如我所提到的,任何方法都适用于接收方。选择取决于谁控制接收器并为它们编写代码。如果是你,那么你几乎可以选择任何东西(为了简单起见,我建议使用 OpenPGP——它支持对称加密和基于密钥的加密)。 XMLEnc 标准更复杂,因此更难使用。 我有控制权推荐接收者遵循一定的编码来解密 XML。但我不能将它们限制为操作系统或编程语言或框架。我想应该没问题。现在假设我更喜欢使用 OpenPGP(听起来这是最方便的方式)。您能否提供一些参考资料,我可以在其中查找加密消息并将其解密。感谢您在这方面的帮助。 虽然它没有给我语法。它照亮了它。谢谢

以上是关于C#.NET 在一台机器上加密 XML 并在另一台机器上解密的主要内容,如果未能解决你的问题,请参考以下文章

从在一台机器上工作的浏览器下载 S3 图像并在另一台机器上给出 CORS 错误

为啥我的 Perl 程序在一台机器上得到污染警告,而在另一台机器上却没有?

C++:Cookie 不存储在一台机器上,而是存储在另一台机器上

php 在一台机器上解析失败,但在另一台机器上解析失败

javax.net.ssl.SSLHandshakeException 在一台机器上,但不是在另一台机器上

在另一台机器上模拟本地用户