2011-07-25 28 views
0

私はサーバーとクライアントを持っています。 セキュリティに関する課題があります。 サーバーとクライアントの間の会話: クライアント:設定ファイル、サーバーを与えてください! サーバー:デジタル署名付きの設定ファイルを送信する クライアント:データを受信するC言語のデジタル署名

どのような方法を選択すればよいですか?

  1. プライベートキーと公開キー(サーバー側)を生成します。 XMLファイル内
  2. 保存秘密鍵(TIP1)
  3. クライアントは、(秘密鍵と一緒に生成された)公開鍵

クライアントがサーバにリクエストを送信する際に、よりで拡散されます。 1.サーバはXMLファイル(TIP1)から秘密鍵を取得し、設定ファイル+デジタル署名(秘密鍵で暗号化)を送信する。 2.クライアントはサーバから応答を受信し、公開鍵でデジタル署名を確認する。

C#のアイデア? キー(プライベートとパブリック)私は特別なプログラムによって生成されます。秘密鍵はxml-fileに保存されます。

さらに

私は多分、私がしたい仕事をいくつかのクラスを書いた:

public class Cryptography 
{ 
    private const string CONTAINER_NAME = "MyContainer"; 

    private static RSACryptoServiceProvider rsa; 
    private static MD5 md5; 

    private static void AssignParameter() 
    {   
     CspParameters cspParams; 
     cspParams = new CspParameters(); 
     cspParams.KeyContainerName = CONTAINER_NAME; 
     cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 

     rsa = new RSACryptoServiceProvider(cspParams); 
    } 

    static Cryptography() 
    { 
     md5 = MD5.Create(); 
    } 

    public static byte[] CreateSignature(byte[] data, string pathToKey) 
    { 
     AssignParameter(); 

     StreamReader reader = new StreamReader(pathToKey); 
     string privateKeyXML = reader.ReadToEnd(); 
     rsa.FromXmlString(privateKeyXML); 
     reader.Close(); 

     RSAPKCS1SignatureFormatter RSAform = new RSAPKCS1SignatureFormatter(rsa); 
     RSAform.SetHashAlgorithm("MD5"); 

     byte[] hashData = md5.ComputeHash(data); 

     return RSAform.CreateSignature(hashData); 
    } 

    public static bool VerifySignature(byte[] originalData, byte[] data, string pathToKey) 
    { 
     StreamReader reader = new StreamReader(pathToKey); 
     string publicKeyXML = reader.ReadToEnd(); 
     rsa.FromXmlString(publicKeyXML); 
     reader.Close(); 

     RSAPKCS1SignatureDeformatter RSAdeform = new RSAPKCS1SignatureDeformatter(rsa); 
     RSAdeform.SetHashAlgorithm("MD5"); 

     byte[] hashOriginalData = md5.ComputeHash(originalData); 

     return RSAdeform.VerifySignature(hashOriginalData, data); 
    } 

    public static void AssignNewKey() 
    { 
     AssignParameter(); 

     StreamWriter writer = new StreamWriter(@"D:\cryptography\privatekey.xml"); 
     string privatePrivateKeyXML = rsa.ToXmlString(true); 
     writer.Write(privatePrivateKeyXML); 
     writer.Close(); 

     writer = new StreamWriter(@"D:\cryptography\publickey.xml"); 
     string publicOnlyKeyXML = rsa.ToXmlString(false); 
     writer.Write(publicOnlyKeyXML); 
     writer.Close(); 

    } 

} 

あなたはどう思いますか?

答えて

0

ホイールを改造するのではなく、WCFのトランスポートまたはメッセージセキュリティを使用して、それを使用するだけで済みます。何らかの理由でWCFを使用することができない場合を除きます。

+0

私はキーを使用してそれを処理する必要がある理由があります。 – Developex

+1

あなたの質問にその理由を説明する必要があります。 –

+0

ソフトの要件では.NET 2.0しか使用できません – Developex