Де/шифрование по алгоритму Эль-Гамаля - C#
Формулировка задачи:
Суть в чём: мне необходимо реализовать шифрование и дешифрование текста с использованием алгоритма Эль-Гамаля. С самой реализацией особых проблем не возникло, консольное приложение работает, но требуется оконное приложение. Весь написанный код - ниже. Интерфейс: 3 текстовых поля. txtBIn - сюда вводится текст сообщения, rTxtBOut - вывод зашифрованного сообщения, txtBTest - вывод расшифрованного сообщения из rTxtBOut. Шифрование и дешифрование происходят автоматически при изменении текста в txtBIn. Проблема заключается в том, что дешифровка шифрованного сообщения не даёт нужного результата - получается нечто невразумительное. Зашифрованное сообщение "Test" представляет собой строку вида: "529 563 529 91 529 86 529 128 ", при этом расшифрованное сообщение выглядит так: "ȍĨƫȈǸȇǧ". Помогите, пожалуйста, решить эту проблему.
Листинг программы
- private int Rand()//Ф-я получения случайного числа
- {
- Random random = new Random();
- return random.Next();
- }
- int power(int a, int b, int n) // a^b mod n - возведение a в степень b по модулю n
- {
- int tmp=a;
- int sum=tmp;
- for(int i=1;i<b;i++)
- {
- for(int j=1;j<a;j++)
- {
- sum+=tmp;
- if(sum>=n)
- {
- sum-=n;
- }
- }
- tmp=sum;
- }
- return tmp;
- }
- int mul(int a, int b, int n) // a*b mod n - умножение a на b по модулю n
- {
- int sum=0;
- for(int i=0;i<b;i++){
- sum+=a;
- if(sum>=n)
- {
- sum-=n;
- }
- }
- return sum;
- }
- void crypt(int p, int g, int x, string strIn) //Шифрование
- {
- rTxtBOut.Text = "";
- int y = power(g, x, p);
- txtBPublicKey.Text="Открытый ключ (p,g,y) = (" + p + "," + g + "," + y + ")";
- txtBSecretKey.Text = "Закрытый ключ x = " + x;
- IEnumerator<char> Enum = strIn.GetEnumerator();
- Enum.Reset();
- if (Enum.MoveNext())
- {
- char t = Enum.Current;
- int m = Convert.ToInt32(t);
- for (int i = 1; i <= strIn.Length; i++)
- {
- if (m > 0)
- {
- t = Enum.Current;
- m = Convert.ToInt32(t);
- int k = Rand() % (p - 2) + 1; // 1 < k < (p-1)
- int a = power(g, k, p);
- int b = mul(power(y, k, p), m, p);
- rTxtBOut.Text = rTxtBOut.Text + a + " " + b + " ";
- Enum.MoveNext();
- }
- }
- }
- }
- void decrypt(int p, int x, string strIn) //Дешифрование
- {
- rTxtBOut.Text = "";
- lblTest.Text = "";
- txtBTest.Text = "";
- string[] strT = strIn.Split();
- IEnumerator<char> Enum = strT.ToString().GetEnumerator();
- Enum.Reset();
- for (int i = 0; i < strIn.Length; i++)
- {
- int a = 0;
- int b = 0;
- if (Enum.MoveNext())
- {
- char t = Enum.Current;
- a = Convert.ToInt32(t);
- }
- if (Enum.MoveNext())
- {
- char t = Enum.Current;
- b = Convert.ToInt32(t);
- }
- if ((a != 0) && (b != 0))
- {
- 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 - трудно было найти нормальную формулу, в ней вся загвоздка
- char m = (char)deM;
- //rTxtBOut.Text = rTxtBOut.Text + m;
- txtBTest.Text = txtBTest.Text + m;
- }
- //Enum.MoveNext();
- }
- }
- private void txtBIn_TextChanged(object sender, EventArgs e) //Обработка изменения текста в текстовом поле
- {
- string strIn = txtBIn.Text;
- string strOut = rTxtBOut.Text;
- int p = Convert.ToInt32(numP.Value);
- int g = Convert.ToInt32(numG.Value);
- int x = Convert.ToInt32(numX.Value);
- crypt(p, g, x, strIn);
- decrypt(p, x, strOut);
- }
Решение задачи: «Де/шифрование по алгоритму Эль-Гамаля»
textual
Листинг программы
- int p = Convert.ToInt32(numP.Value);
- int g = Convert.ToInt32(numG.Value);
- int x = Convert.ToInt32(numX.Value);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д