我需要在 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键。那么它是如何解密的,它不需要和密钥解密。这种解密是否也适用于其他机器。
答案 0 :(得分:1)
存在多种加密方法。
对称加密使用相同的密钥来加密和解密数据。 AES加密算法就是这种加密的一个例子。
非对称(基于公钥和私钥)加密使用一对密钥。在此模式下,您使用其公钥加密某人的数据。他使用他的私钥(你没有,也不应该有)来解密为他准备的数据。使用基于证书的PKCS#7 / CMS标准或使用OpenPGP来实现非对称加密。
现在关于XML。您可以使用上述方法之一加密它,就好像它是二进制数据一样。或者您可以使用XMLEnc标准对其进行加密。
使用方式取决于谁决定或要求加密格式和方法。如果是你做出决定,那么决定应该基于双方可以使用哪些功能(库,代码)以及如何管理密钥(PKI比对称密钥更难管理 bit ,但一般来说PKI更安全)。
请注意:我们的SecureBlackbox产品在.NET,Java和其他平台上支持对称和基于证书的加密(二进制,XMLEnc和OpenPGP)。