Де/шифрование по алгоритму Эль-Гамаля - C#

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

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

Суть в чём: мне необходимо реализовать шифрование и дешифрование текста с использованием алгоритма Эль-Гамаля. С самой реализацией особых проблем не возникло, консольное приложение работает, но требуется оконное приложение. Весь написанный код - ниже. Интерфейс: 3 текстовых поля. txtBIn - сюда вводится текст сообщения, rTxtBOut - вывод зашифрованного сообщения, txtBTest - вывод расшифрованного сообщения из rTxtBOut. Шифрование и дешифрование происходят автоматически при изменении текста в txtBIn. Проблема заключается в том, что дешифровка шифрованного сообщения не даёт нужного результата - получается нечто невразумительное. Зашифрованное сообщение "Test" представляет собой строку вида: "529 563 529 91 529 86 529 128 ", при этом расшифрованное сообщение выглядит так: "ȍĨƫȈǸȇǧ". Помогите, пожалуйста, решить эту проблему.
Листинг программы
  1. private int Rand()//Ф-я получения случайного числа
  2. {
  3. Random random = new Random();
  4. return random.Next();
  5. }
  6. int power(int a, int b, int n) // a^b mod n - возведение a в степень b по модулю n
  7. {
  8. int tmp=a;
  9. int sum=tmp;
  10. for(int i=1;i<b;i++)
  11. {
  12. for(int j=1;j<a;j++)
  13. {
  14. sum+=tmp;
  15. if(sum>=n)
  16. {
  17. sum-=n;
  18. }
  19. }
  20. tmp=sum;
  21. }
  22. return tmp;
  23. }
  24. int mul(int a, int b, int n) // a*b mod n - умножение a на b по модулю n
  25. {
  26. int sum=0;
  27. for(int i=0;i<b;i++){
  28. sum+=a;
  29. if(sum>=n)
  30. {
  31. sum-=n;
  32. }
  33. }
  34. return sum;
  35. }
  36. void crypt(int p, int g, int x, string strIn) //Шифрование
  37. {
  38. rTxtBOut.Text = "";
  39. int y = power(g, x, p);
  40. txtBPublicKey.Text="Открытый ключ (p,g,y) = (" + p + "," + g + "," + y + ")";
  41. txtBSecretKey.Text = "Закрытый ключ x = " + x;
  42. IEnumerator<char> Enum = strIn.GetEnumerator();
  43. Enum.Reset();
  44. if (Enum.MoveNext())
  45. {
  46. char t = Enum.Current;
  47. int m = Convert.ToInt32(t);
  48. for (int i = 1; i <= strIn.Length; i++)
  49. {
  50. if (m > 0)
  51. {
  52. t = Enum.Current;
  53. m = Convert.ToInt32(t);
  54. int k = Rand() % (p - 2) + 1; // 1 < k < (p-1)
  55. int a = power(g, k, p);
  56. int b = mul(power(y, k, p), m, p);
  57. rTxtBOut.Text = rTxtBOut.Text + a + " " + b + " ";
  58. Enum.MoveNext();
  59. }
  60. }
  61. }
  62. }
  63. void decrypt(int p, int x, string strIn) //Дешифрование
  64. {
  65. rTxtBOut.Text = "";
  66. lblTest.Text = "";
  67. txtBTest.Text = "";
  68. string[] strT = strIn.Split();
  69. IEnumerator<char> Enum = strT.ToString().GetEnumerator();
  70. Enum.Reset();
  71. for (int i = 0; i < strIn.Length; i++)
  72. {
  73. int a = 0;
  74. int b = 0;
  75. if (Enum.MoveNext())
  76. {
  77. char t = Enum.Current;
  78. a = Convert.ToInt32(t);
  79. }
  80. if (Enum.MoveNext())
  81. {
  82. char t = Enum.Current;
  83. b = Convert.ToInt32(t);
  84. }
  85. if ((a != 0) && (b != 0))
  86. {
  87. int deM = mul(b, power(a, p - 1 - x,p), p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p - трудно было найти нормальную формулу, в ней вся загвоздка
  88. char m = (char)deM;
  89. //rTxtBOut.Text = rTxtBOut.Text + m;
  90. txtBTest.Text = txtBTest.Text + m;
  91. }
  92. //Enum.MoveNext();
  93. }
  94. }
  95. private void txtBIn_TextChanged(object sender, EventArgs e) //Обработка изменения текста в текстовом поле
  96. {
  97. string strIn = txtBIn.Text;
  98. string strOut = rTxtBOut.Text;
  99. int p = Convert.ToInt32(numP.Value);
  100. int g = Convert.ToInt32(numG.Value);
  101. int x = Convert.ToInt32(numX.Value);
  102. crypt(p, g, x, strIn);
  103. decrypt(p, x, strOut);
  104. }

Решение задачи: «Де/шифрование по алгоритму Эль-Гамаля»

textual
Листинг программы
  1. int p = Convert.ToInt32(numP.Value);
  2. int g = Convert.ToInt32(numG.Value);
  3. int x = Convert.ToInt32(numX.Value);

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


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

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

8   голосов , оценка 3.875 из 5

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

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

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