Де/шифрование по алгоритму Эль-Гамаля - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д