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(); } }
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(); } }