Чат с шифрованием по Плейферу. Как передать ключ для формирования матрицы? - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Вот код чата сообщения между собеседниками должны передаваться зашифрованными причем ключ у каждого собеседника свой (ник = ключ) на основании ключа формируется матрица для шифровки по Плейферу сообщение шифруется и передается другому собеседнику моя проблема в том, что я не знаю как получить ключ от собеседника чтобы дешифровать его сообщение вот код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
 
namespace Chat_APP
{
    public partial class Form1 : Form
    {
        Socket socket;
        EndPoint epLocal, epRemote;
 
        // все символы алфавитов английские русские + знаки, вся длина строки = 160
        String ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя !@\"#№$;%^:&?*()-_+={}[]\\/<>.,~`0123456789";
        
        // матрица для шифровки расшифровки
        // формируется динамически на основании переданного Ключа и строки ABC
        // строку из 160 символов будем разбивать на двумерный массив размером 10x16
        char[,] Matrix = new char[10, 16];
 
        static public string Ключ;
 
        //
        public Form1()
        {
            InitializeComponent();
 
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            
            // IP = 127.0.0.1 для локальной сети
            textLocalIP.Text  = "127.0.0.1";  //ПолучитьЛокальныйАдресIP();
            textFriendIP.Text = "127.0.0.1"; //ПолучитьЛокальныйАдресIP();
            //// если связь НЕ по локальной сети то нужно получать IP
            //textLocalIP.Text  = ПолучитьЛокальныйАдресIP();
            //textFriendIP.Text = ПолучитьЛокальныйАдресIP();
            
            // Номер порта = 15000 можно любой другой
            textLocalPort.Text  = "15000"; // мой порт - локальный
            textFriendPort.Text = "15001"; // порт собеседника - удаленный
            
            // во 2-ом окне нужно ввести порты наоборот:
            // мой порт         = "15001"
            // порт собеседника = "15000"
        }

        // Подключение к сети
        private void buttonStart_Click(object sender, EventArgs e)
        {
            try
            {
                epLocal = new IPEndPoint(IPAddress.Parse(textLocalIP.Text), Convert.ToInt32(textLocalPort.Text));
                socket.Bind(epLocal);
 
                epRemote = new IPEndPoint(IPAddress.Parse(textFriendIP.Text), Convert.ToInt32(textFriendPort.Text));
                socket.Connect(epRemote);
 
                byte[] buffer = new byte[1500];
                socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
 
                buttonStart.Text    = "Подключён";
                buttonStart.Enabled = false;
                // разрешаем поле и кнопку отправки сообщений
                textMessage.Enabled = true;
                buttonSend.Enabled  = true;
                // переводим фокус на ввод сообщения
                textMessage.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
 
        private void buttonSend_Click(object sender, EventArgs e)
        {
            ОтправитьСообщение();
        }
 
        private void textMessage_KeyDown(object sender, KeyEventArgs e)
        {
            // если нажата Enter в поле сообщения то отправляем сообщение
            if (e.KeyCode == Keys.Enter)
            {
                ОтправитьСообщение();
            }
        }

        // Отправка сообщения
        private void ОтправитьСообщение()
        {
            try
            {
                Ключ = textBoxNick.Text; // глобальный
 
                // конвертация текста в байты для передачи
                byte[] byteMsg = new byte[1500];
 
                ///
                string Key = textBoxNick.Text; // ключ = Ник
                //string SendMessage = textMessage.Text;
                string Сообщение  = textMessage.Text;
                string ТекстДляОтправки = Key + "Ё" + textMessage.Text; // отправляемая строка
 
                //// шифровка текста
                //СоздатьМатрицу(Key);
                string ЗашифрованноеСообщение = ЗашифроватьТекст(Сообщение, Key);
                textBoxEncodedMsg.Text = ЗашифрованноеСообщение;
                string sKey = ПолучитьКлючИзСообщения(ТекстДляОтправки);
                string sMsg = ПолучитьТекстИзСообщения(ТекстДляОтправки);
                textBoxDecodedMsg.Text = РасшифроватьТекст(ЗашифрованноеСообщение, Key);
 
                string ЗашифрованныйТекстДляОтправки = ЗашифроватьТекст(ТекстДляОтправки, Key);
                // перевод строки в набор битов
                //byteMsg = Encoding.Default.GetBytes(ЗашифрованныйТекстДляОтправки);
                //byteMsg = Encoding.Unicode.GetBytes(Сообщение);
                byteMsg = Encoding.Unicode.GetBytes(ЗашифрованныйТекстДляОтправки);
 
                socket.Send(byteMsg); // отправка сообщения
 
                listMessage.Items.Add("Я: " + Сообщение);
                //listMessage.Items.Add(textBoxNick.Text + ": " + textMessage.Text);
 
                textMessage.Clear();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
 
        // получение сообщения
        private void ПолучитьСообщение(IAsyncResult aresut)
        {
            try
            {
                int size = socket.EndReceiveFrom(aresut, ref epRemote);
 
                if (size > 0)
                {
                    byte[] byteПолученныеДанные = new byte[1464];
                    byteПолученныеДанные = (byte[])aresut.AsyncState;
                    //string ПолученныйТекст = Encoding.Default.GetString(byteПолученныеДанные);
                    string ПолученныйТекст = Encoding.Unicode.GetString(byteПолученныеДанные);
                    ПолученныйТекст = ПолученныйТекст.TrimEnd();
 
                    // Дешифровка
                    string РасшифрованныйТекст = РасшифроватьТекст(ПолученныйТекст, Ключ);
 
                    // выделить ключ и текст сообщения из полученных данных
                    string Кеу = ПолучитьКлючИзСообщения(ПолученныйТекст);
                    string РасшифрованноеСообщение = ПолучитьТекстИзСообщения(ПолученныйТекст);
        
                    // вывести в список сообщений
                    //listMessage.Items.Add("Друг: " + receivedMessage);
                    ////listMessage.Items.Add(textBoxNick.Text + ": " + receivedMessage);
                    //listMessage.Items.Add(strReceivedMessage);
                    listMessage.Items.Add(Кеу + ": " + РасшифрованноеСообщение);
                }
                
                byte[] buffer = new byte[1500];
                socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString());
            }
        }

        // Получить IP адрес компьютера
        private string ПолучитьЛокальныйАдресIP()
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());
 
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                    return ip.ToString(); // возвращаем сетевой IP
            }
            return "127.0.0.1"; // возвращаем локальный IP
        }
 
        // Выход
        private void buttonExit_Click(object sender, EventArgs e)
        {
            Close();
        }

        // -----------------------------------------------------------------
        #region Шифрование-Дешифрование
 
        // Получить ключ из полученной строки
        // Ключ в полученном сообщении отделен символом Ё от текста
        string ПолучитьКлючИзСообщения(string strMsg)
        {
            // разбиваем сообщение на массив строк по символу Ё
            string[] arrMsg = strMsg.Split('Ё');
            string key = arrMsg[0]; // ключ
            string msg = arrMsg[1]; // сообщение
 
            return key;
        }
 
        // Получить только текст сообщения из полученной строки без ключа
        // Ключ в полученном сообщении отделен символом Ё от текста
        string ПолучитьТекстИзСообщения(string strMsg)
        {
            // разбиваем сообщение на массив строк по символу Ё
            string[] arrMsg = strMsg.Split('Ё');
            string key = arrMsg[0]; // ключ
            string msg = arrMsg[1]; // сообщение
 
            return msg;
        }
 
        // Проверка Шифрования
        private void buttonEncode_Click(object sender, EventArgs e)
        {
            string Key = textBoxNick.Text; // ключ = Ник
            //СоздатьМатрицу(Key);
            if (textBoxDecodedMsg.Text != "")
            {
                string msg = textBoxDecodedMsg.Text.TrimEnd();
 
                textBoxEncodedMsg.Text = ЗашифроватьТекст(msg, Key);
            }
        }
 
        // Проверка ДеШифрования
        private void buttonDecode_Click(object sender, EventArgs e)
        {
            string Key = textBoxNick.Text; // ключ = Ник
            //СоздатьМатрицу(Key);
            if (textBoxEncodedMsg.Text != "")
            {
                string msg = textBoxEncodedMsg.Text;
                textBoxDecodedMsg.Text = РасшифроватьТекст(msg, Key);
            }
        }

        // Функция создания матрицы
        void СоздатьМатрицу(string Key)
        {
            String Alphabet = "";
            // добавляем ключ
            for (int i = 0; i < Key.Length; i++)
            {
                if (Alphabet.IndexOf(Key[i]) == -1)
                    Alphabet += Key[i];
            }
            // добавляем остальные символы из ABC
            for (int i = 0; i < ABC.Length; i++)
            {
                if (Alphabet.IndexOf(ABC[i]) == -1)
                    Alphabet += ABC[i];
            }
 
            // заполняем массив букв решетки
            int num = 0;
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 16; j++)
                {
                    Matrix[i, j] = Alphabet[num];
                    num++;
                }
        }
 
        // ------------------------
        // Шифрование текста
        string ЗашифроватьТекст(string Text, string Key)
        {
 
            СоздатьМатрицу(Key);
 
            if (Text.Length % 2 != 0)
                Text = Text + " ";
 
            string Результат = "";
 
            // индексы букв в столбцах
            int ind_x1 = 0;
            int ind_y1 = 0;
            int ind_x2 = 0;
            int ind_y2 = 0;
 
            int k = 0;
            while (k < Text.Length)
            {
                for (int i = 0; i < 10; i++)
                    for (int j = 0; j < 16; j++)
                    {
                        if (Text[k] == Matrix[i, j])
                        {
                            ind_x1 = i;
                            ind_y1 = j;
                        }
 
                        if (Text[k + 1] == Matrix[i, j])
                        {
                            ind_x2 = i;
                            ind_y2 = j;
                        }
                    }
 
                // Если буквы находятся в одной строке
                if (ind_x1 == ind_x2)
                {
                    if (ind_y1 == 15)
                    {
                        Результат += Matrix[ind_x1, 0];
                        Результат += Matrix[ind_x2, ind_y2 + 1];
                    }
                    else
                        if (ind_y2 == 15)
                        {
                            Результат += Matrix[ind_x1, ind_y1 + 1];
                            Результат += Matrix[ind_x2, 0];
                        }
                        else
                        {
                            Результат += Matrix[ind_x1, ind_y1 + 1];
                            Результат += Matrix[ind_x2, ind_y2 + 1];
                        }
                }
 
                // Если буквы находятся в одном столбце
                if (ind_y1 == ind_y2)
                {
                    if (ind_x1 == 9)
                    {
                        Результат += Matrix[0, ind_y1];
                        Результат += Matrix[ind_x2 + 1, ind_y2];
                    }
                    else
                        if (ind_x2 == 9)
                        {
                            Результат += Matrix[ind_x1 + 1, ind_y1];
                            Результат += Matrix[0, ind_y2];
                        }
                        else
                        {
                            Результат += Matrix[ind_x1 + 1, ind_y1];
                            Результат += Matrix[ind_x2 + 1, ind_y2];
                        }
                }
 
                // Если буквы находятся в разных строках и разных столбцах
                if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))
                {
                    Результат += Matrix[ind_x1, ind_y2];
                    Результат += Matrix[ind_x2, ind_y1];
                }
 
                k = k + 2;
            }
            return Результат;
        }
 
        // ---------------------------
        // Дешифрование текста
        string РасшифроватьТекст(string Text, string Key)
        {
            СоздатьМатрицу(Key);
 
            string Результат = "";
            
            // индексы букв в столбцах
            int ind_x1 = 0;
            int ind_y1 = 0;
            int ind_x2 = 0;
            int ind_y2 = 0;
 
            int k = 0;
            while (k < Text.Length)
            {
                for (int i = 0; i < 10; i++)
                    for (int j = 0; j < 16; j++)
                    {
                        if (Text[k] == Matrix[i, j])
                        {
                            ind_x1 = i;
                            ind_y1 = j;
                        }
 
                        if (Text[k + 1] == Matrix[i, j])
                        {
                            ind_x2 = i;
                            ind_y2 = j;
                        }
                    }
 
                // Если буквы находятся в одной строке
                if (ind_x1 == ind_x2)
                {
                    if (ind_y1 == 0)
                    {
                        Результат += Matrix[ind_x1, 15];
                        Результат += Matrix[ind_x2, ind_y2 - 1];
                    }
                    else
                        if (ind_y2 == 0)
                        {
                            Результат += Matrix[ind_x1, ind_y1 - 1];
                            Результат += Matrix[ind_x2, 15];
                        }
                        else
                        {
                            Результат += Matrix[ind_x1, ind_y1 - 1];
                            Результат += Matrix[ind_x2, ind_y2 - 1];
                        }
                }
 
                // Если буквы находятся в одном столбце
                if (ind_y1 == ind_y2)
                {
                    if (ind_x1 == 0)
                    {
                        Результат += Matrix[9, ind_y1];
                        Результат += Matrix[ind_x2 - 1, ind_y2];
                    }
                    else
                        if (ind_x2 == 0)
                        {
                            Результат += Matrix[ind_x1 - 1, ind_y1];
                            Результат += Matrix[9, ind_y2];
                        }
                        else
                        {
                            Результат += Matrix[ind_x1 - 1, ind_y1];
                            Результат += Matrix[ind_x2 - 1, ind_y2];
                        }
                }
 
                // Если буквы находятся в разных строках и разных столбцах
                if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))
                {
                    Результат += Matrix[ind_x1, ind_y2];
                    Результат += Matrix[ind_x2, ind_y1];
                }
 
                k = k + 2;
            }
            return Результат;
        }
        #endregion //Шифрование-Дешифрование
 
    }
}
кто может помогите пожалста моему горю голова кругом уже а завтра сдаваться (

Решение задачи: «Чат с шифрованием по Плейферу. Как передать ключ для формирования матрицы?»

textual
Листинг программы
        private void ПолучитьСообщение(IAsyncResult aresut)
        {
            string Кеу, РасшифрованноеСообщение;
            try
            {
                int size = socket.EndReceiveFrom(aresut, ref epRemote);
                if (size > 0)
                {
                    byte[] byteПолученныеДанные = new byte[1464];
                    byteПолученныеДанные = (byte[])aresut.AsyncState;
                    string ПолученныйТекст = Encoding.Unicode.GetString(byteПолученныеДанные);
                    // выделить ключ и текст сообщения из полученных данных
                    Кеу = ПолучитьКлючИзСообщения(ПолученныйТекст);
                    string ПолученноеСообщение = ПолучитьТекстИзСообщения(ПолученныйТекст);
                    // Дешифровка
                    РасшифрованноеСообщение = РасшифроватьТекст(ПолученноеСообщение, Кеу);
                    // вывести в список сообщений 
                    listMessage.Items.Add(Кеу + ": " + РасшифрованноеСообщение); //<- вот здесь выбрасывает исключение см. картинку
                }
                
                byte[] buffer = new byte[1500];
                socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString());
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы