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