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 不存储在一台机器上,而是存储在另一台机器上