Пример #1
0
 static void Main(string[] args)
 {
     Console.Write("Введите свое имя: ");
     if (args.Length == 2)
     {
         Chat chat = new Chat(Console.ReadLine(), args[0], Convert.ToInt32(args[1]));
         Console.WriteLine("Добро пожаловать, {0}", chat.UserName);
         for (int i = 0; i < 3; i++)
         {
             chat.SendMessage(Console.ReadLine());
         }
         Console.WriteLine("До свидания, {0}!", chat.UserName);
         chat.Disconnect();
     }
     else
     {
         Chat chat = new Chat(Console.ReadLine());
         Console.WriteLine("Добро пожаловать, {0}", chat.UserName);
         for (int i = 0; i < 3; i++)
         {
             chat.SendMessage(Console.ReadLine());
         }
         Console.WriteLine("До свидания, {0}!", chat.UserName);
         chat.Disconnect();
     }
 }
Пример #2
0
        static void Main(string[] args)
        {
            BigInteger random = RandomInteger(2048 / 8);

            Console.WriteLine(random);

            client = new TcpClient();
            try
            {
                client.Connect(host, port);  // подключение клиента
                stream = client.GetStream(); // получаем поток


                // получаем p и g от сервера
                BinaryReader reader = new BinaryReader(stream);

                string     pString = reader.ReadString();
                BigInteger p       = BigInteger.Parse(pString);
                //BigInteger p = new BigInteger(pByte);
                //BigInteger p = FromBigEndian(pByte);
                Console.WriteLine("p: {0}", p);

                BinaryWriter writer = new BinaryWriter(stream);
                writer.Write("gGO");

                string     gString = reader.ReadString();
                BigInteger g       = BigInteger.Parse(gString);
                Console.WriteLine("g: {0}", g);

                // проверка p и g
                bool gCorrect = CheakG(p, g);
                Console.WriteLine("g correct? - {0}", gCorrect.ToString());
                bool gcorrect = CheakBetween(g, p);
                Console.WriteLine("g correct? - {0}", gcorrect.ToString());

                #region AES256
                //................................................................
                //Console.WriteLine("Enter text that needs to be encrypted..");
                //string data = Console.ReadLine();

                //AesManaged aes = new AesManaged();
                //string hexString = "1234567891234567234567123456781234567823456781234567234578234573";
                //var bytes = new byte[hexString.Length / 2];
                //for (var i = 0; i < 17; i++)
                //{
                //    bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                //}

                //byte[] key = bytes;

                //hexString = "1234567891234567234567123456781234567823456781234567234578234573";
                //bytes = new byte[hexString.Length / 4];
                //for (var i = 0; i < 9; i++)
                //{
                //    bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                //}

                //byte[] iv = bytes;

                //byte[] encrypted = Encrypt(data, key, iv);
                //// Print encrypted string
                //Console.WriteLine($"Encrypted data: {System.Text.Encoding.Default.GetString(encrypted)}");
                //// Decrypt the bytes to a string.
                //string decrypted = Decrypt(encrypted, key, iv);
                //// Print decrypted string. It should be same as raw data
                //Console.WriteLine($"Decrypted data: {decrypted}");


                //Console.ReadLine();
                //...........................................................
                #endregion

                //Console.Write("Введите свое имя: ");
                //userName = Console.ReadLine();

                // отправляем имя пользователя на сервер
                //writer.Write(userName);

                Console.Write("Введите свое имя: ");

                userName = Console.ReadLine();

                // отправляем имя пользователя на сервер
                writer.Write(userName);

                // генерируем ключ A
                BigInteger A = BigInteger.ModPow(g, random, p);
                Console.WriteLine("A: {0}", A.ToString());

                // получаем метку для старта
                string go = reader.ReadString();

                Console.WriteLine("go: {0}", go);



                // отправляем ключ А на сервер
                writer.Write(A.ToString());
                //writer.Flush();

                // получаем ключ B от второго клиента
                string     BString = reader.ReadString();
                BigInteger B       = BigInteger.Parse(BString);
                Console.WriteLine("B: {0}", B);

                bool Bcorrect = CheakBetween(B, p);
                Console.WriteLine("B correct? - {0}", Bcorrect.ToString());

                // вычисляем секретный общий ключ K
                BigInteger numberK = BigInteger.ModPow(B, random, p);
                Console.WriteLine("K: {0}", numberK);

                byte[] K = numberK.ToByteArray();

                SHA256Managed hash            = new SHA256Managed();
                byte[]        key_hash        = hash.ComputeHash(K);
                byte[]        key_fingerprint = new byte[8];
                Buffer.BlockCopy(key_hash, key_hash.Length - 8, key_fingerprint, 0, key_fingerprint.Length);

                //using (MemoryStream plaintextBuffer = new MemoryStream(K.Length + 40))
                //{
                //    plaintextBuffer.Write(K, 0, K.Length);
                //    while (plaintextBuffer.Position % 256 != 0)
                //    {
                //        plaintextBuffer.WriteByte(0); // TODO: random padding
                //    }
                //    K = plaintextBuffer.ToArray();
                //}

                string usernameB = reader.ReadString();

                // генерируем ключ и вектор для AES256
                //List<byte[]> keyAndIE = GenerateAES_KeyAndIV_Bytes(K, "plaintext");

                //byte[] key = keyAndIE[0];
                //byte[] iv = keyAndIE[1];

                // начало чата
                // создаем объект чата для получения и передачи зашифрованных сообщений
                Chat chat = new Chat(stream, client, K, usernameB, key_fingerprint);

                // запускаем новый поток для получения данных
                Thread receiveThread = new Thread(new ThreadStart(chat.ReceiveMessage));
                receiveThread.Start(); //старт потока
                Console.WriteLine("Добро пожаловать, {0}", userName);
                chat.SendMessage();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Disconnect();
            }
        }