Де/шифрование по алгоритму Эль-Гамаля - 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);