Condividi tramite


Codice sorgente di Mallory.cs (esempio CNG)

Aggiornamento: Luglio 2008

L'esempio di comunicazione protetta tramite Cryptography Next Generation (CNG) è costituito da tre applicazioni console: Alice, Bob e Mallory. L'applicazione Mallory (file Mallory.cs) contiene il codice seguente.

using System;                           // Required for the IDisposable interface
using System.Text;                      // Required for the Encoding class

public partial class CNG_SecureCommunicationExample
{
    static int  MyColor = 5;                        // Bob White displays white text
    static int  OtherColor = 4;                     // Alice Green displays green text
    static bool fDisplaySendMessage = true;         // Boolean flag controls output display visibility

     static void Main()
        {
        InitConsole("Mallory Purple", 310, 490);
        string s = "";
        while (true)
            {
            SplashScreen();
            s = AppControl("receive", "MalloryControlChannel");
            if ("exit" == s) break;              
            Run();
            }
        }          // End Main


    static void Run()
    {
        ASCIIEncoding enc = new ASCIIEncoding();

        InitializeOptions();

        Display("Hi, I'm Mallory, the man in the middle.\n" +
                "I wonder what Alice and Bob are talking about.\n" +
                "I think I'll listen in.\n\n");

        string AliceChannelName = ReceiveChannelName();
        string BobChannelName   = AliceChannelName + "1";
        SendChannelName(BobChannelName);

//-------------------------------------------------------------------------------------------------


        using (Communicator MalloryAlice = new Communicator("client", AliceChannelName))
        using (Communicator MalloryBob = new Communicator("server", BobChannelName))
            {
            string s;
            fDisplaySendMessage = true;

            if (3 <= Version)
                {
                Display("\nI know Alice will publicaly send Bob a digital signature key.\n");
                byte[] DSKey = MalloryAlice.ChMgr.ReadMessage();                      // Read the message
                MalloryAlice.StoreDSKey(DSKey);
                MalloryBob.StoreDSKey(DSKey);

                s = enc.GetString(DSKey);
                if (fVerbose)
                    {
                    Display("Here it is:\n\n");
                    Display(s + "\n\n", 4);
                    }
                MalloryBob.ChMgr.SendMessage(DSKey);
                }

            if (2 <= Version)
                {
                Display(sep, 1);
                Display("Alice and Bob are going to exchange their\n" +
                        "public cryptographic keys through a public channel.\n" +  // Send and Receive ECDH public keys
                        "First, Alice will send Bob her key.\n\n");

                MalloryAlice.Send_or_Receive_PublicCryptoKey("receive", 4);
                Display("Good.  I just intercepted Alice's public key: \n");
                Display("Next, I will send my MalloryAlice public cryptographic key to Alice:\n\nSending...\n");
                MalloryAlice.Send_or_Receive_PublicCryptoKey("send", 5);

                Display("Next, I will send my MalloryBob public cryptographic key to Bob:\n\nSending...\n");
                MalloryBob.Send_or_Receive_PublicCryptoKey("send", 5);
                Display("Now I will receive Bob's public key: \n");
                if (! MalloryBob.Send_or_Receive_PublicCryptoKey("receive", 2))
                    {                
                    Display("I've been discovered!\n\n",0);
                    System.Threading.Thread.Sleep(3000);
                    return;
                    }
                Display("Good.  I just intercepted Bob's public key: \n");
                }

//-------------------------------------------------------------------------------------------------
// Now that all the keys have been transmitted, have a conversation.

            if (1 < Version)
                {
                Display(sep, 1);
                Display("Now that they have exchanged their keys,\n" +
                       "they can have a secure conversation:\n\n", 5);
                Display(sep, 1);
                }

            Display("From Alice:\n",7);
            OtherColor = 4; 
            s = MalloryAlice.ReceiveMessage();

            Display("To Bob:\n",7); 
            MalloryBob.SendMessage(s,true);

            Display("From Bob:\n",7); 
            OtherColor = 2; 
            s = MalloryBob.ReceiveMessage();

            Display("To Alice:\n",7); 
            MalloryAlice.SendMessage(s,true);

            Display("From Alice:\n",7); 
            OtherColor = 4; 
            string NewSalesContact = MalloryAlice.ReceiveMessage();

            Display("To Bob:\n",7);
            string FakeMessage = "Coho Winery, OneEleven EveryStreet, Chicago"; 
            MalloryBob.SendMessage(FakeMessage,true);

            Display("From Bob:\n",7);
            OtherColor = 2; 
            MalloryBob.ReceiveMessage();

            Display("To Alice:\n",7); 
            MalloryAlice.SendMessage("I think the address is wrong, but I'll keep trying",true);

           // -------------   Gloat   ------------
            if (!fVerbose && Version >= 3)
                Display(sep1, 1);

            Display("\nI am so clever!\n\n" +
                   "Here is what I received: " + NewSalesContact + "\n" +
                   "and here is what I sent: " + FakeMessage + "\n\n" +
                   "They will never catch me!\n\n\n");

            //-------------------------------------------------------------------------------------------------
            if (Version <= 2)
                Display(sep1, 1);

            Display("Perhaps they will talk some more?\n"      +
                   "I'll listen in on what they say\n" +
                   "and add a few extra characters to their messages\n\n");
            Display(sep + sep1,1);
            s = "";

            while (true)
                {
                Display("From Alice:\n",7);
                OtherColor = 4; 
                s = MalloryAlice.ReceiveMessage();
                if ("" == s)
                    {
                    MalloryBob.SendMessage(s,true);
                    break;
                    }

                Display("Send to Bob:\n",7);
                    if (!MalloryBob.SendMessage(s + " qwerty",true))        // If Alice entered CTRL-C, or SYS_CLOSE
                    break;

                Display("From Bob:\n",7);
                OtherColor = 2; 
                s = MalloryBob.ReceiveMessage();

                Display("Send to Alice:\n",7);
                if ("" != s)
                    s += " ytrewq";

                if (!MalloryAlice.SendMessage(s,true))                  // If Alice entered CTRL-C, or SYS_CLOSE
                    break;

                if ("" == s)
                    break;
                }
            }        // End using (Communicator MalloryAlice, Communicator MalloryBob)
//-------------------------------------------------------------------------------------------------
       }       // End Run

}       // public partial class CNG_SecureCommunicationExample

Vedere anche

Attività

Procedura: compilare ed eseguire l'esempio CNG

Concetti

Cenni preliminari sul codice sorgente (esempio CNG)

Esempio di comunicazione protetta tramite Cryptography Next Generation (CNG)

Altre risorse

Servizi di crittografia

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Argomento aggiunto.

Miglioramento delle informazioni.