2013-04-05 65 views
0

我需要在上執行GET/PUT/DELETE/POST消息httpwebrequestC#.NET在一臺機器上加密XML並在其他機器上解密

我的請求正文包含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

存在幾種加密方法。

對稱加密使用相同的密鑰來加密和解密數據。 AES加密算法就是這種加密的一個例子。

非對稱(基於公鑰和私鑰)加密使用一對密鑰。在這種模式下,你使用他的公鑰爲某人加密數據。他使用他的私鑰(你沒有和不應該有)來解密爲他準備的數據。非對稱加密是使用基於證書的PKCS#7/CMS標準或使用OpenPGP完成的。

現在講述XML。您可以使用上述方法之一加密它,就好像它是二進制數據一樣。或者您可以使用XMLEnc標準對其進行加密。

使用方式取決於誰決定或要求加密格式和方法。如果是你做決定,那麼決定應該基於雙方能夠使用哪些能力(庫,代碼)以及如何管理密鑰(PKI是比對稱密鑰難以管理的,但是通常PKI更安全)。

請注意:我們的SecureBlackbox產品支持.NET,Java和其他平臺上的對稱和基於證書的加密(二進制,XMLEnc和OpenPGP)。

+0

感謝您的信息,我的要求是我必須通過httpwebrequest傳遞加密的XML,並且相同或不同平臺的接收者應該能夠接收和解密。我發現很難找到最簡單的方法,因爲這裏的發件人是一個,接收者是多個。所有接收者應該能夠解密。你能建議一個最好的方法嗎? – HaBo 2013-04-12 15:19:52

+0

@Habo正如我所提到的,任何方法都可以在接收端工作。選擇取決於誰控制接收器併爲其編寫代碼。如果是你,那麼你可以選擇幾乎任何東西(我建議OpenPGP的使用簡單 - 它支持對稱和基於密鑰的加密)。 XMLEnc標準可能更難以使用,因爲它更復雜。 – 2013-04-12 17:31:55

+0

我有控制權建議接收器遵循特定的編碼來解密XML。但是我不能將它們限制爲OS和編程語言或框架。我想這應該沒問題。現在讓我們說我更喜歡使用OpenPGP(聽起來這是最方便的方式)。你可以提供某種參考,我可以查找加密消息並將其解密。我感謝你的幫助。 – HaBo 2013-04-12 18:16:24

相關問題