2009-07-06 16 views
7

暗号化するには2つの方法が必要ですが、キーが "hello world"のxmlファイルを暗号化するにはキーのhello worldを使用してXMLファイルの暗号化と復号化を行う必要があります。すべてのマシンで!どのような暗号化方法でも可能です。以下のXMLファイルの内容:C#XMLファイルを暗号化する

<root> 
    <lic> 
     <number>19834209</number> 
     <expiry>02/02/2002</expiry> 
    </lic> 
</root> 

は、いくつかは私にサンプルを与えることができ、問題がMSDNのサンプルencyptionsがencypted xmlファイルを作成しているが、私は別のマシン上で復号化するとき、それはwork.For例に

をしないのですか?私はこのサンプルを試しました: How to: Encrypt XML Elements with Asymmetric Keys、 しかし、ここにいくつかのセッションがあり、別のマシンには、悪いデータがあります。

+1

XML文書に署名し、検証する方法ですあなたのコードの短い例を掲示し、正確に何が動作しない(例えば、「12行目では、私はcompilorエラー12345を取得」、または「の間にしてください実行時に15行目にSecurityExceptionが発生します)。 – Treb

+1

悪意のあるデータが暗号化クラスであふれている – abmv

+1

データを暗号化して非表示にするか、データを変更から保護する必要がありますか? – sisve

答えて

13

暗号化と復号化に同じ鍵が必要な場合は、対称的な方法を使用する必要があります(これは実際の定義です)。あなたのサンプル(同じソース)に最も近いものがここにあります。 http://msdn.microsoft.com/en-us/library/sb7w85t6.aspx

投稿されたサンプルは、同じキーを使用していないため動作していません。別のマシンだけでなく、同じマシンで2回プログラムを実行すると、毎回異なるランダムキーが使用されるため、どちらも機能しません(私にとってはうまくいかない)。あなたの鍵を作成した後に、このコードを追加すること
してみてください。

key = new RijndaelManaged(); 

string password = "Password1234"; //password here 
byte[] saltBytes = Encoding.UTF8.GetBytes("Salt"); // salt here (another string) 
var p = new Rfc2898DeriveBytes(password, saltBytes); //TODO: think about number of iterations (third parameter) 
// sizes are devided by 8 because [ 1 byte = 8 bits ] 
key.IV = p.GetBytes(key.BlockSize/8); 
key.Key = p.GetBytes(key.KeySize/8); 

今すぐプログラムが同じ鍵と初期ベクトルを使用しており、暗号化と復号化は、すべてのマシン上で動作するはずです。
また、keyからalgorithmに名前を変更することを検討してください。そうしないと、誤解を招きます。私はそれがMSDNの悪い、うまくいかない例だと言いたい。

PasswordDeriveBytes.GetBytes()PasswordDeriveBytesクラス内であるため、重大な(セキュリティ)の問題で廃止されました。上記のコードは、より安全なRfc2898DeriveBytesクラス(PBKDF1ではなくPBKDF2)を使用するように書き直されました。 PasswordDeriveBytesを使用して上記で生成されたコードは危険にさらされる可能性があります。

も参照してください:あなたは<LIC>要素に署名する秘密鍵を使用し、(おそらく<ハッシュ>要素で)結果をファイルに追加した場合Recommended # of iterations when using PKBDF2-SHA256?

+0

私はそのサンプルを試しました。私は復号化だけをコメントアウトし、暗号化してから暗号化を解読し、復号化は機能しません。どうして? – abmv

+0

おかげさまで、msdnみたいな人たちよ、あなたは私の日を救ってくれました。 – abmv

+1

私はこれらの複雑な暗号化のすべてを理解する時間を持っていました。私は実際にはMSDNを読んで理解しようとしていましたが、それを正しく説明できない場合は誰ができるのですか?ファイルを暗号化する暗号理論全体を理解する必要はありません。まあ、ネットにはクラスがあり、私は時間を節約するためにそれらを使う必要があります!そして、私は彼らがあなたに一番の例を与え、少なくともそれは異なるマシンで動作するはずです! – abmv

4

はクーラーだろう。これにより、サポート担当者がライセンス番号または有効期限を知る必要がある場合に備えて、誰でもxmlファイルを読むことができるようになりますが、秘密鍵なしで値を変更することはできません。

署名の検証に必要な公開鍵は一般的な知識です。あなたのコード署名

明確化
が変更のみに対してそれを保護する、それが隠され、その中に任意の情報を保持しません。元の質問には暗号化が含まれていますが、データを非表示にしたり、変更から保護する必要があるかどうかはわかりません。

例コード:(PrivateKey.keyを公開しないでください。ServerMethodsはxmlファイルに署名するときにのみ必要です.ClientMethodsはxmlファイルの検証時にのみ必要です。)

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Security.Cryptography; 
using System.Text; 
using System.Xml; 

public static class Program { 
    public static void Main() { 
     if (!File.Exists("PublicKey.key")) { 
      // Assume first run, generate keys and sign document. 
      ServerMethods.GenerateKeyPair(); 

      var input = new XmlDocument(); 
      input.Load("input.xml"); 
      Debug.Assert(input.DocumentElement != null); 

      var licNode = input.DocumentElement["lic"]; 
      Debug.Assert(licNode != null); 

      var licNodeXml = licNode.OuterXml; 
      var signedNode = input.CreateElement("signature"); 
      signedNode.InnerText = ServerMethods.CalculateSignature(licNodeXml); 
      input.DocumentElement.AppendChild(signedNode); 

      input.Save("output.xml"); 
     } 

     if (ClientMethods.IsValidLicense("output.xml")) { 
      Console.WriteLine("VALID"); 
     } else { 
      Console.WriteLine("INVALID"); 
     } 
    } 

    public static class ServerMethods { 
     public static void GenerateKeyPair() { 
      var rsa = SharedInformation.CryptoProvider; 

      using (var keyWriter = File.CreateText("PublicKey.key")) 
       keyWriter.Write(rsa.ToXmlString(false)); 

      using (var keyWriter = File.CreateText("PrivateKey.key")) 
       keyWriter.Write(rsa.ToXmlString(true)); 
     } 

     public static string CalculateSignature(string data) { 
      var rsa = SharedInformation.CryptoProvider; 
      rsa.FromXmlString(File.ReadAllText("PrivateKey.key")); 

      var dataBytes = Encoding.UTF8.GetBytes(data); 
      var signatureBytes = rsa.SignData(dataBytes, SharedInformation.HashAlgorithm); 
      return Convert.ToBase64String(signatureBytes); 
     } 
    } 

    public static class ClientMethods { 
     public static bool IsValid(string data, string signature) { 
      var rsa = SharedInformation.CryptoProvider; 
      rsa.FromXmlString(File.ReadAllText("PublicKey.key")); 

      var dataBytes = Encoding.UTF8.GetBytes(data); 
      var signatureBytes = Convert.FromBase64String(signature); 
      return rsa.VerifyData(dataBytes, SharedInformation.HashAlgorithm, signatureBytes); 
     } 

     public static bool IsValidLicense(string filename) { 
      var doc = new XmlDocument(); 
      doc.Load(filename); 

      var licNode = doc.SelectSingleNode("/root/lic") as XmlElement; 
      var signatureNode = doc.SelectSingleNode("/root/signature") as XmlElement; 
      if (licNode == null || signatureNode == null) return false; 

      return IsValid(licNode.OuterXml, signatureNode.InnerText); 
     } 
    } 

    public static class SharedInformation { 
     public static int KeySize { 
      get { return 1024; } 
     } 

     public static string HashAlgorithm { 
      get { return "SHA512"; } 
     } 

     public static RSACryptoServiceProvider CryptoProvider { 
      get { return new RSACryptoServiceProvider(KeySize, new CspParameters()); } 
     } 
    } 
} 
+0

私はmsdnから2つのサンプルを試しましたが、問題はdiffマシンで適切にdecyptに取得できます。 – abmv

3

まず第一に、あなたが暗号化および復号化に同じ鍵を使用したい場合、あなたは対称暗号をご覧ください。非対称暗号化は、暗号化と復号化の鍵が異なる場合です。 RSAは非対称であり、TripleDESとRijndaelは対称です。他にもいくつかありますが、.NETにはデフォルト実装がありません。

私はSystem.Security.Cryptography namespaceを勉強することをお勧めします。そして、すべてのものについて少し学ぶ。それは、あなたがパスワードを生成するだけでなく、ファイルの暗号化と復号化に必要なすべてを持っています。具体的には、あなたは、これらのクラスに興味があるかもしれない:

  • CryptoStream
  • PasswordDeriveBytes
  • RijndaelManaged

は、それらのそれぞれのためのMSDNでの使用のための例もあります。これらのクラスを使用して、XMLだけでなくすべてのファイルを暗号化することができます。しかし、いくつかの要素を選択して暗号化したい場合は、System.Security.Cryptography.Xml名前空間を参照してください。私はあなたがすでにそれについて1つの記事を見つけたのを見ます。そのページのリンクをたどり続けると、それらのクラスについてもっと学びます。

2

これはあなたがデジタルSign XML Documents

+0

も私がここで提起した同様の質問の1つを見るhttp://stackoverflow.com/questions/1031856/digitally-sign-parts-of-a-xml-document – Eros