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

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


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

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

8   голосов , оценка 3.875 из 5
Похожие ответы