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

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

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

Добрый вечер! Вот код чата сообщения между собеседниками должны передаваться зашифрованными причем ключ у каждого собеседника свой (ник = ключ) на основании ключа формируется матрица для шифровки по Плейферу сообщение шифруется и передается другому собеседнику моя проблема в том, что я не знаю как получить ключ от собеседника чтобы дешифровать его сообщение вот код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Windows.Forms;
  10. using System.Net;
  11. using System.Net.Sockets;
  12. using System.Threading;
  13. using System.IO;
  14. namespace Chat_APP
  15. {
  16. public partial class Form1 : Form
  17. {
  18. Socket socket;
  19. EndPoint epLocal, epRemote;
  20. // все символы алфавитов английские русские + знаки, вся длина строки = 160
  21. String ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя !@\"#№$;%^:&?*()-_+={}[]\\/<>.,~`0123456789";
  22. // матрица для шифровки расшифровки
  23. // формируется динамически на основании переданного Ключа и строки ABC
  24. // строку из 160 символов будем разбивать на двумерный массив размером 10x16
  25. char[,] Matrix = new char[10, 16];
  26. static public string Ключ;
  27. //
  28. public Form1()
  29. {
  30. InitializeComponent();
  31. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  32. socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
  33. // IP = 127.0.0.1 для локальной сети
  34. textLocalIP.Text = "127.0.0.1"; //ПолучитьЛокальныйАдресIP();
  35. textFriendIP.Text = "127.0.0.1"; //ПолучитьЛокальныйАдресIP();
  36. //// если связь НЕ по локальной сети то нужно получать IP
  37. //textLocalIP.Text = ПолучитьЛокальныйАдресIP();
  38. //textFriendIP.Text = ПолучитьЛокальныйАдресIP();
  39. // Номер порта = 15000 можно любой другой
  40. textLocalPort.Text = "15000"; // мой порт - локальный
  41. textFriendPort.Text = "15001"; // порт собеседника - удаленный
  42. // во 2-ом окне нужно ввести порты наоборот:
  43. // мой порт = "15001"
  44. // порт собеседника = "15000"
  45. }
  46.  
  47. // Подключение к сети
  48. private void buttonStart_Click(object sender, EventArgs e)
  49. {
  50. try
  51. {
  52. epLocal = new IPEndPoint(IPAddress.Parse(textLocalIP.Text), Convert.ToInt32(textLocalPort.Text));
  53. socket.Bind(epLocal);
  54. epRemote = new IPEndPoint(IPAddress.Parse(textFriendIP.Text), Convert.ToInt32(textFriendPort.Text));
  55. socket.Connect(epRemote);
  56. byte[] buffer = new byte[1500];
  57. socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
  58. buttonStart.Text = "Подключён";
  59. buttonStart.Enabled = false;
  60. // разрешаем поле и кнопку отправки сообщений
  61. textMessage.Enabled = true;
  62. buttonSend.Enabled = true;
  63. // переводим фокус на ввод сообщения
  64. textMessage.Focus();
  65. }
  66. catch (Exception ex)
  67. {
  68. MessageBox.Show(ex.ToString());
  69. }
  70. }
  71. private void buttonSend_Click(object sender, EventArgs e)
  72. {
  73. ОтправитьСообщение();
  74. }
  75. private void textMessage_KeyDown(object sender, KeyEventArgs e)
  76. {
  77. // если нажата Enter в поле сообщения то отправляем сообщение
  78. if (e.KeyCode == Keys.Enter)
  79. {
  80. ОтправитьСообщение();
  81. }
  82. }
  83.  
  84. // Отправка сообщения
  85. private void ОтправитьСообщение()
  86. {
  87. try
  88. {
  89. Ключ = textBoxNick.Text; // глобальный
  90. // конвертация текста в байты для передачи
  91. byte[] byteMsg = new byte[1500];
  92. ///
  93. string Key = textBoxNick.Text; // ключ = Ник
  94. //string SendMessage = textMessage.Text;
  95. string Сообщение = textMessage.Text;
  96. string ТекстДляОтправки = Key + "Ё" + textMessage.Text; // отправляемая строка
  97. //// шифровка текста
  98. //СоздатьМатрицу(Key);
  99. string ЗашифрованноеСообщение = ЗашифроватьТекст(Сообщение, Key);
  100. textBoxEncodedMsg.Text = ЗашифрованноеСообщение;
  101. string sKey = ПолучитьКлючИзСообщения(ТекстДляОтправки);
  102. string sMsg = ПолучитьТекстИзСообщения(ТекстДляОтправки);
  103. textBoxDecodedMsg.Text = РасшифроватьТекст(ЗашифрованноеСообщение, Key);
  104. string ЗашифрованныйТекстДляОтправки = ЗашифроватьТекст(ТекстДляОтправки, Key);
  105. // перевод строки в набор битов
  106. //byteMsg = Encoding.Default.GetBytes(ЗашифрованныйТекстДляОтправки);
  107. //byteMsg = Encoding.Unicode.GetBytes(Сообщение);
  108. byteMsg = Encoding.Unicode.GetBytes(ЗашифрованныйТекстДляОтправки);
  109. socket.Send(byteMsg); // отправка сообщения
  110. listMessage.Items.Add("Я: " + Сообщение);
  111. //listMessage.Items.Add(textBoxNick.Text + ": " + textMessage.Text);
  112. textMessage.Clear();
  113. }
  114. catch (Exception ex)
  115. {
  116. MessageBox.Show(ex.ToString());
  117. }
  118. }
  119. // получение сообщения
  120. private void ПолучитьСообщение(IAsyncResult aresut)
  121. {
  122. try
  123. {
  124. int size = socket.EndReceiveFrom(aresut, ref epRemote);
  125. if (size > 0)
  126. {
  127. byte[] byteПолученныеДанные = new byte[1464];
  128. byteПолученныеДанные = (byte[])aresut.AsyncState;
  129. //string ПолученныйТекст = Encoding.Default.GetString(byteПолученныеДанные);
  130. string ПолученныйТекст = Encoding.Unicode.GetString(byteПолученныеДанные);
  131. ПолученныйТекст = ПолученныйТекст.TrimEnd();
  132. // Дешифровка
  133. string РасшифрованныйТекст = РасшифроватьТекст(ПолученныйТекст, Ключ);
  134. // выделить ключ и текст сообщения из полученных данных
  135. string Кеу = ПолучитьКлючИзСообщения(ПолученныйТекст);
  136. string РасшифрованноеСообщение = ПолучитьТекстИзСообщения(ПолученныйТекст);
  137. // вывести в список сообщений
  138. //listMessage.Items.Add("Друг: " + receivedMessage);
  139. ////listMessage.Items.Add(textBoxNick.Text + ": " + receivedMessage);
  140. //listMessage.Items.Add(strReceivedMessage);
  141. listMessage.Items.Add(Кеу + ": " + РасшифрованноеСообщение);
  142. }
  143. byte[] buffer = new byte[1500];
  144. socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
  145. }
  146. catch (Exception exp)
  147. {
  148. MessageBox.Show(exp.ToString());
  149. }
  150. }
  151.  
  152. // Получить IP адрес компьютера
  153. private string ПолучитьЛокальныйАдресIP()
  154. {
  155. IPHostEntry host;
  156. host = Dns.GetHostEntry(Dns.GetHostName());
  157. foreach (IPAddress ip in host.AddressList)
  158. {
  159. if (ip.AddressFamily == AddressFamily.InterNetwork)
  160. return ip.ToString(); // возвращаем сетевой IP
  161. }
  162. return "127.0.0.1"; // возвращаем локальный IP
  163. }
  164. // Выход
  165. private void buttonExit_Click(object sender, EventArgs e)
  166. {
  167. Close();
  168. }
  169.  
  170. // -----------------------------------------------------------------
  171. #region Шифрование-Дешифрование
  172. // Получить ключ из полученной строки
  173. // Ключ в полученном сообщении отделен символом Ё от текста
  174. string ПолучитьКлючИзСообщения(string strMsg)
  175. {
  176. // разбиваем сообщение на массив строк по символу Ё
  177. string[] arrMsg = strMsg.Split('Ё');
  178. string key = arrMsg[0]; // ключ
  179. string msg = arrMsg[1]; // сообщение
  180. return key;
  181. }
  182. // Получить только текст сообщения из полученной строки без ключа
  183. // Ключ в полученном сообщении отделен символом Ё от текста
  184. string ПолучитьТекстИзСообщения(string strMsg)
  185. {
  186. // разбиваем сообщение на массив строк по символу Ё
  187. string[] arrMsg = strMsg.Split('Ё');
  188. string key = arrMsg[0]; // ключ
  189. string msg = arrMsg[1]; // сообщение
  190. return msg;
  191. }
  192. // Проверка Шифрования
  193. private void buttonEncode_Click(object sender, EventArgs e)
  194. {
  195. string Key = textBoxNick.Text; // ключ = Ник
  196. //СоздатьМатрицу(Key);
  197. if (textBoxDecodedMsg.Text != "")
  198. {
  199. string msg = textBoxDecodedMsg.Text.TrimEnd();
  200. textBoxEncodedMsg.Text = ЗашифроватьТекст(msg, Key);
  201. }
  202. }
  203. // Проверка ДеШифрования
  204. private void buttonDecode_Click(object sender, EventArgs e)
  205. {
  206. string Key = textBoxNick.Text; // ключ = Ник
  207. //СоздатьМатрицу(Key);
  208. if (textBoxEncodedMsg.Text != "")
  209. {
  210. string msg = textBoxEncodedMsg.Text;
  211. textBoxDecodedMsg.Text = РасшифроватьТекст(msg, Key);
  212. }
  213. }
  214.  
  215. // Функция создания матрицы
  216. void СоздатьМатрицу(string Key)
  217. {
  218. String Alphabet = "";
  219. // добавляем ключ
  220. for (int i = 0; i < Key.Length; i++)
  221. {
  222. if (Alphabet.IndexOf(Key[i]) == -1)
  223. Alphabet += Key[i];
  224. }
  225. // добавляем остальные символы из ABC
  226. for (int i = 0; i < ABC.Length; i++)
  227. {
  228. if (Alphabet.IndexOf(ABC[i]) == -1)
  229. Alphabet += ABC[i];
  230. }
  231. // заполняем массив букв решетки
  232. int num = 0;
  233. for (int i = 0; i < 10; i++)
  234. for (int j = 0; j < 16; j++)
  235. {
  236. Matrix[i, j] = Alphabet[num];
  237. num++;
  238. }
  239. }
  240. // ------------------------
  241. // Шифрование текста
  242. string ЗашифроватьТекст(string Text, string Key)
  243. {
  244. СоздатьМатрицу(Key);
  245. if (Text.Length % 2 != 0)
  246. Text = Text + " ";
  247. string Результат = "";
  248. // индексы букв в столбцах
  249. int ind_x1 = 0;
  250. int ind_y1 = 0;
  251. int ind_x2 = 0;
  252. int ind_y2 = 0;
  253. int k = 0;
  254. while (k < Text.Length)
  255. {
  256. for (int i = 0; i < 10; i++)
  257. for (int j = 0; j < 16; j++)
  258. {
  259. if (Text[k] == Matrix[i, j])
  260. {
  261. ind_x1 = i;
  262. ind_y1 = j;
  263. }
  264. if (Text[k + 1] == Matrix[i, j])
  265. {
  266. ind_x2 = i;
  267. ind_y2 = j;
  268. }
  269. }
  270. // Если буквы находятся в одной строке
  271. if (ind_x1 == ind_x2)
  272. {
  273. if (ind_y1 == 15)
  274. {
  275. Результат += Matrix[ind_x1, 0];
  276. Результат += Matrix[ind_x2, ind_y2 + 1];
  277. }
  278. else
  279. if (ind_y2 == 15)
  280. {
  281. Результат += Matrix[ind_x1, ind_y1 + 1];
  282. Результат += Matrix[ind_x2, 0];
  283. }
  284. else
  285. {
  286. Результат += Matrix[ind_x1, ind_y1 + 1];
  287. Результат += Matrix[ind_x2, ind_y2 + 1];
  288. }
  289. }
  290. // Если буквы находятся в одном столбце
  291. if (ind_y1 == ind_y2)
  292. {
  293. if (ind_x1 == 9)
  294. {
  295. Результат += Matrix[0, ind_y1];
  296. Результат += Matrix[ind_x2 + 1, ind_y2];
  297. }
  298. else
  299. if (ind_x2 == 9)
  300. {
  301. Результат += Matrix[ind_x1 + 1, ind_y1];
  302. Результат += Matrix[0, ind_y2];
  303. }
  304. else
  305. {
  306. Результат += Matrix[ind_x1 + 1, ind_y1];
  307. Результат += Matrix[ind_x2 + 1, ind_y2];
  308. }
  309. }
  310. // Если буквы находятся в разных строках и разных столбцах
  311. if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))
  312. {
  313. Результат += Matrix[ind_x1, ind_y2];
  314. Результат += Matrix[ind_x2, ind_y1];
  315. }
  316. k = k + 2;
  317. }
  318. return Результат;
  319. }
  320. // ---------------------------
  321. // Дешифрование текста
  322. string РасшифроватьТекст(string Text, string Key)
  323. {
  324. СоздатьМатрицу(Key);
  325. string Результат = "";
  326. // индексы букв в столбцах
  327. int ind_x1 = 0;
  328. int ind_y1 = 0;
  329. int ind_x2 = 0;
  330. int ind_y2 = 0;
  331. int k = 0;
  332. while (k < Text.Length)
  333. {
  334. for (int i = 0; i < 10; i++)
  335. for (int j = 0; j < 16; j++)
  336. {
  337. if (Text[k] == Matrix[i, j])
  338. {
  339. ind_x1 = i;
  340. ind_y1 = j;
  341. }
  342. if (Text[k + 1] == Matrix[i, j])
  343. {
  344. ind_x2 = i;
  345. ind_y2 = j;
  346. }
  347. }
  348. // Если буквы находятся в одной строке
  349. if (ind_x1 == ind_x2)
  350. {
  351. if (ind_y1 == 0)
  352. {
  353. Результат += Matrix[ind_x1, 15];
  354. Результат += Matrix[ind_x2, ind_y2 - 1];
  355. }
  356. else
  357. if (ind_y2 == 0)
  358. {
  359. Результат += Matrix[ind_x1, ind_y1 - 1];
  360. Результат += Matrix[ind_x2, 15];
  361. }
  362. else
  363. {
  364. Результат += Matrix[ind_x1, ind_y1 - 1];
  365. Результат += Matrix[ind_x2, ind_y2 - 1];
  366. }
  367. }
  368. // Если буквы находятся в одном столбце
  369. if (ind_y1 == ind_y2)
  370. {
  371. if (ind_x1 == 0)
  372. {
  373. Результат += Matrix[9, ind_y1];
  374. Результат += Matrix[ind_x2 - 1, ind_y2];
  375. }
  376. else
  377. if (ind_x2 == 0)
  378. {
  379. Результат += Matrix[ind_x1 - 1, ind_y1];
  380. Результат += Matrix[9, ind_y2];
  381. }
  382. else
  383. {
  384. Результат += Matrix[ind_x1 - 1, ind_y1];
  385. Результат += Matrix[ind_x2 - 1, ind_y2];
  386. }
  387. }
  388. // Если буквы находятся в разных строках и разных столбцах
  389. if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))
  390. {
  391. Результат += Matrix[ind_x1, ind_y2];
  392. Результат += Matrix[ind_x2, ind_y1];
  393. }
  394. k = k + 2;
  395. }
  396. return Результат;
  397. }
  398. #endregion //Шифрование-Дешифрование
  399. }
  400. }
кто может помогите пожалста моему горю голова кругом уже а завтра сдаваться (

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

textual
Листинг программы
  1.         private void ПолучитьСообщение(IAsyncResult aresut)
  2.         {
  3.             string Кеу, РасшифрованноеСообщение;
  4.             try
  5.             {
  6.                 int size = socket.EndReceiveFrom(aresut, ref epRemote);
  7.                 if (size > 0)
  8.                 {
  9.                     byte[] byteПолученныеДанные = new byte[1464];
  10.                     byteПолученныеДанные = (byte[])aresut.AsyncState;
  11.                     string ПолученныйТекст = Encoding.Unicode.GetString(byteПолученныеДанные);
  12.                     // выделить ключ и текст сообщения из полученных данных
  13.                     Кеу = ПолучитьКлючИзСообщения(ПолученныйТекст);
  14.                     string ПолученноеСообщение = ПолучитьТекстИзСообщения(ПолученныйТекст);
  15.                     // Дешифровка
  16.                     РасшифрованноеСообщение = РасшифроватьТекст(ПолученноеСообщение, Кеу);
  17.                     // вывести в список сообщений
  18.                     listMessage.Items.Add(Кеу + ": " + РасшифрованноеСообщение); //<- вот здесь выбрасывает исключение см. картинку
  19.                 }
  20.                
  21.                 byte[] buffer = new byte[1500];
  22.                 socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(ПолучитьСообщение), buffer);
  23.             }
  24.             catch (Exception exp)
  25.             {
  26.                 MessageBox.Show(exp.ToString());
  27.             }
  28.         }

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


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

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

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы