Example #1
0
        private void f15_fieldKey_KeyPress(object sender, KeyPressEventArgs e)
        {
            char symb = e.KeyChar;

            if (f15_fieldCiphertext.TextLength > 0 &&
                (alf.IndexOf(symb) == -1 && ALF.IndexOf(symb) == -1 && symb != (char)8))
            {
                e.Handled = true;
            }
        }
Example #2
0
        private void f15_fieldKey_TextChanged(object sender, EventArgs e)
        {
            if (f15_fieldKey.TextLength > 0)
            {
                string res = "";
                int    j   = 0;
                for (int i = 0; i < f15_fieldCiphertext.TextLength; i++)
                {
                    int curSymbNum = alf.IndexOf(f15_fieldCiphertext.Text[i]);
                    int rotSymbNum = alf.IndexOf(f15_fieldKey.Text[j]);
                    if (curSymbNum != -1)
                    {//строчная буква
                        res += alf[((curSymbNum - rotSymbNum) + alf.Length) % alf.Length];
                        j++;
                        j = j % f15_fieldKey.TextLength;
                    }
                    else
                    {
                        curSymbNum = ALF.IndexOf(f15_fieldCiphertext.Text[i]);
                        if (curSymbNum != -1)//заглавная буква
                        {
                            res += ALF[((curSymbNum - rotSymbNum) + ALF.Length) % ALF.Length];
                            j++;
                            j = j % f15_fieldKey.TextLength;
                        }
                        else
                        {
                            //Символы, которых нет в алфавите, просто переносятся \
                            //и не меняют позицию в ключе
                            res += f15_fieldCiphertext.Text[i];

                            /*j++;
                             * j = j % f15_fieldKey.TextLength; */
                        }
                    }
                }
                f15_fieldOriginal.Text = res;
            }
            else
            {
                f15_fieldOriginal.Text = null;
            }
        }
Example #3
0
        private void f10_ButtonEncrypt_Click(object sender, EventArgs e)
        {
            string Source      = f10_fieldOriginal.Text;
            string entered_key = Regex.Replace(f10_fieldKeyword.Text, "[^a-zA-Zа-яА-ЯёЁ]", "");

            f10_fieldKeyword.Text = entered_key;
            entered_key           = entered_key.Replace("J", "I").Replace("Ё", "Е").Replace("Й", "И").Replace("Ь", "Ъ").Replace("j", "i").Replace("ё", "е").Replace("й", "и").Replace("ь", "ъ").ToLower();

            if (what_language(Source) == -1 || what_language(entered_key) == -1 || (what_language(Source) * what_language(entered_key)) == 2) //Разные языки
            {
                MessageBox.Show("Поля должны быть заполнены только на английском или только на русском языке.", "Ошибка");
                goto metka_exit;
            }
            Source = Source.Replace("J", "I").Replace("Ё", "Е").Replace("Й", "И").Replace("Ь", "Ъ").Replace("j", "i").Replace("ё", "е").Replace("й", "и").Replace("ь", "ъ");

            //Выбор алфавита
            string ALF, alf;
            bool   lenIsRus;
            int    rows, columns;

            if (what_language(Source) == 1) //Русский текст и русский/пустой ключ
            {
                ALF      = ALF_RU;
                alf      = alf_ru;
                lenIsRus = true;
                rows     = 5;
                columns  = 6;
            }
            else
            {
                ALF      = ALF_EN;
                alf      = alf_en;
                lenIsRus = false;
                rows     = 5;
                columns  = 5;
            }

            //Сохраним регистр и будем работать только с нижним
            int[] isUpper = new int[Source.Length];
            for (int i = 0; i < Source.Length; i++)
            {
                if (ALF.IndexOf(Source[i]) >= 0)
                {
                    isUpper[i] = 1;
                }
                else
                {
                    isUpper[i] = 0;
                }
            }
            Source = Source.ToLower();
            char[] message = Source.ToCharArray();

            //Формирование таблицы, на основе которой будет происходить шифрование (будет располагаться в одномерном массиве) 5 строк, 6 столбцов
            int gridSize = alf.Length;

            char[] PlayfairGrid = new char[gridSize];
            int    keyPos       = 0;
            int    gridPos      = 0;

            int[] times = new int[alf.Length];   //иницилизация массива вхождений
            for (int i = 0; i < times.Length; i++)
            {
                times[i] = 0;                                    //обнуление массива вхождений
            }
            while (keyPos < entered_key.Length)
            {
                if (alf.IndexOf(entered_key[keyPos]) >= 0 && times[alf.IndexOf(entered_key[keyPos])] == 0)
                {
                    times[alf.IndexOf(entered_key[keyPos])]++;
                    PlayfairGrid[gridPos] = entered_key[keyPos];
                    gridPos++;
                }
                keyPos++;
            }
            int alfPos = 0;

            while (gridPos < gridSize)
            {
                if (times[alfPos] == 0)
                {
                    times[alfPos]++;
                    PlayfairGrid[gridPos] = alf[alfPos];
                    gridPos++;
                }
                alfPos++;
            }

            //Добавим мусорные буквы в последовательные пары одинаковых буквы
            int similar        = 0;
            int previousLetter = 0;

            while (!char.IsLetter(message[previousLetter]))
            {
                previousLetter++;
            }
            //Считаем количество пар одинаковых букв, идущих подряд.
            for (int i = previousLetter + 1; i < message.Length; i++)
            {
                if (message[previousLetter] == message[i])
                {
                    similar++;
                }
                if (char.IsLetter(message[i]))
                {
                    previousLetter = i;
                }
            }

            char[] tmp      = new char[message.Length + similar];
            int[]  register = new int[message.Length + similar + 1];
            int    rot      = 0;
            char   letter   = '⁣';

            //Добавление букв
            for (int i = 0; i < tmp.Length; i++)
            {
                if (char.IsLetter(message[i - rot]) && message[i - rot] == letter)
                {
                    if (lenIsRus)
                    {
                        tmp[i] = 'х';
                        if (letter == 'х')
                        {
                            tmp[i] = 'ъ';
                        }
                    }
                    else
                    {
                        tmp[i] = 'x';
                        if (letter == 'x')
                        {
                            tmp[i] = 'q';
                        }
                    }
                    register[i] = 0;
                    i++;
                    rot++;
                    tmp[i]      = message[i - rot];
                    register[i] = isUpper[i - rot];
                }
                else
                {
                    tmp[i]      = message[i - rot];
                    register[i] = isUpper[i - rot];
                }
                if (char.IsLetter(message[i - rot]))
                {
                    letter = message[i - rot];
                }
            }

            //Добавим букву в конец, если букв нечетное количество
            int amount_letters = 0;

            for (int i = 0; i < tmp.Length; i++)
            {
                if (char.IsLetter(tmp[i]))
                {
                    amount_letters++;
                }
            }
            if (amount_letters % 2 == 1)
            {
                char[] tmp2 = tmp;
                tmp = new char[tmp.Length + 1];
                for (int i = 0; i < tmp2.Length; i++)
                {
                    tmp[i] = tmp2[i];
                }
                if (lenIsRus)
                {
                    tmp[tmp.Length - 1] = 'х';
                    if (tmp[tmp.Length - 2] == 'х')
                    {
                        tmp[tmp.Length - 1] = 'ъ';
                    }
                }
                else
                {
                    tmp[tmp.Length - 1] = 'x';
                    if (tmp[tmp.Length - 2] == 'x')
                    {
                        tmp[tmp.Length - 1] = 'q';
                    }
                }
                register[tmp.Length - 1] = 0;
            }

            //Парное шифрование
            string playfair = new string(PlayfairGrid);
            int    pair_found = 0;                              //сколько элементов найдено для пары
            int    first_letter_ind = 0, second_letter_ind = 0; //индексы элементов, составляющих пару

            for (int i = 0; i < tmp.Length; i++)
            {
                if (playfair.IndexOf(tmp[i]) >= 0)
                {
                    if (pair_found == 0)
                    {
                        first_letter_ind = i;
                        pair_found++;
                    }
                    else
                    {
                        second_letter_ind = i;
                        char[] pair = new char[2];  //Адреса символов в исходном тексте
                        pair[0] = tmp[first_letter_ind];
                        pair[1] = tmp[second_letter_ind];
                        int[] x_coord = new int[2];
                        x_coord[0] = playfair.IndexOf(pair[0]) % columns;             //столбец
                        x_coord[1] = playfair.IndexOf(pair[1]) % columns;             //столбец
                        int[] y_coord = new int[2];
                        y_coord[0] = playfair.IndexOf(pair[0]) / columns;             //строка
                        y_coord[1] = playfair.IndexOf(pair[1]) / columns;             //строка
                        //Зашифрование пары символов
                        if ((y_coord[0] == y_coord[1]) && (x_coord[0] != x_coord[1])) //символы находятся в одной строке
                        {
                            tmp[first_letter_ind]  = playfair[columns * y_coord[0] + ((x_coord[0] + 1) % columns)];
                            tmp[second_letter_ind] = playfair[columns * y_coord[1] + ((x_coord[1] + 1) % columns)];
                        }
                        if ((y_coord[0] != y_coord[1]) && (x_coord[0] == x_coord[1])) //символы находятся в одном столбце
                        {
                            tmp[first_letter_ind]  = playfair[columns * ((y_coord[0] + 1) % rows) + x_coord[0]];
                            tmp[second_letter_ind] = playfair[columns * ((y_coord[1] + 1) % rows) + x_coord[1]];
                        }
                        if ((y_coord[0] != y_coord[1]) && (x_coord[0] != x_coord[1])) //символы образуют прямоугольник
                        {
                            tmp[first_letter_ind]  = playfair[columns * y_coord[0] + x_coord[1]];
                            tmp[second_letter_ind] = playfair[columns * y_coord[1] + x_coord[0]];
                        }
                        //Конец зашифрования пары символов
                        pair_found = 0;
                    }
                }
            }

            for (int i = 0; i < tmp.Length; i++)
            {
                if (register[i] == 1)
                {
                    tmp[i] = ALF[alf.IndexOf(tmp[i])];
                }
            }

            f10_fieldCiphertext.Text = new string(tmp);
            metka_exit :;
        }
Example #4
0
        private void f10_ButtonDecrypt_Click(object sender, EventArgs e)
        {
            string Source      = f10_fieldCiphertext.Text;
            string entered_key = Regex.Replace(f10_fieldKeyword.Text, "[^a-zA-Zа-яА-ЯёЁ]", "");

            f10_fieldKeyword.Text = entered_key;
            entered_key           = entered_key.Replace("J", "I").Replace("Ё", "Е").Replace("Й", "И").Replace("Ь", "Ъ").Replace("j", "i").Replace("ё", "е").Replace("й", "и").Replace("ь", "ъ").ToLower();

            if (what_language(Source) == -1 || what_language(entered_key) == -1 || (what_language(Source) * what_language(entered_key)) == 2) //Разные языки
            {
                MessageBox.Show("Поля должны быть заполнены только на английском или только на русском языке.", "Ошибка");
                goto metka_exit;
            }
            Source = Source.Replace("J", "I").Replace("Ё", "Е").Replace("Й", "И").Replace("Ь", "Ъ").Replace("j", "i").Replace("ё", "е").Replace("й", "и").Replace("ь", "ъ");

            //Выбор алфавита
            string ALF, alf;
            int    rows, columns;

            if (what_language(Source) == 1) //Русский текст и русский/пустой ключ
            {
                ALF     = ALF_RU;
                alf     = alf_ru;
                rows    = 5;
                columns = 6;
            }
            else
            {
                ALF     = ALF_EN;
                alf     = alf_en;
                rows    = 5;
                columns = 5;
            }

            //Сохраним регистр и будем работать только с нижним
            int[] isUpper = new int[Source.Length];
            for (int i = 0; i < Source.Length; i++)
            {
                if (ALF.IndexOf(Source[i]) >= 0)
                {
                    isUpper[i] = 1;
                }
                else
                {
                    isUpper[i] = 0;
                }
            }
            Source = Source.ToLower();
            char[] message = Source.ToCharArray();

            //Формирование таблицы, на основе которой будет происходить шифрование (будет располагаться в одномерном массиве) 5 строк, 6 столбцов
            int gridSize = alf.Length;

            char[] PlayfairGrid = new char[gridSize];
            int    keyPos       = 0;
            int    gridPos      = 0;

            int[] times = new int[alf.Length];   //иницилизация массива вхождений
            for (int i = 0; i < times.Length; i++)
            {
                times[i] = 0;                                    //обнуление массива вхождений
            }
            while (keyPos < entered_key.Length)
            {
                if (alf.IndexOf(entered_key[keyPos]) >= 0 && times[alf.IndexOf(entered_key[keyPos])] == 0)
                {
                    times[alf.IndexOf(entered_key[keyPos])]++;
                    PlayfairGrid[gridPos] = entered_key[keyPos];
                    gridPos++;
                }
                keyPos++;
            }
            int alfPos = 0;

            while (gridPos < gridSize)
            {
                if (times[alfPos] == 0)
                {
                    times[alfPos]++;
                    PlayfairGrid[gridPos] = alf[alfPos];
                    gridPos++;
                }
                alfPos++;
            }

            //Парное шифрование
            string playfair = new string(PlayfairGrid);
            int    pair_found = 0;                              //сколько элементов найдено для пары
            int    first_letter_ind = 0, second_letter_ind = 0; //индексы элементов, составляющих пару

            for (int i = 0; i < message.Length; i++)
            {
                if (playfair.IndexOf(message[i]) >= 0)
                {
                    if (pair_found == 0)
                    {
                        first_letter_ind = i;
                        pair_found++;
                    }
                    else
                    {
                        second_letter_ind = i;
                        char[] pair = new char[2];  //Адреса символов в исходном тексте
                        pair[0] = message[first_letter_ind];
                        pair[1] = message[second_letter_ind];
                        int[] x_coord = new int[2];
                        x_coord[0] = playfair.IndexOf(pair[0]) % columns;             //столбец
                        x_coord[1] = playfair.IndexOf(pair[1]) % columns;             //столбец
                        int[] y_coord = new int[2];
                        y_coord[0] = playfair.IndexOf(pair[0]) / columns;             //строка
                        y_coord[1] = playfair.IndexOf(pair[1]) / columns;             //строка
                        //Зашифрование пары символов
                        if ((y_coord[0] == y_coord[1]) && (x_coord[0] != x_coord[1])) //символы находятся в одной строке
                        {
                            message[first_letter_ind]  = playfair[columns * y_coord[0] + ((x_coord[0] - 1 + columns) % columns)];
                            message[second_letter_ind] = playfair[columns * y_coord[1] + ((x_coord[1] - 1 + columns) % columns)];
                        }
                        if ((y_coord[0] != y_coord[1]) && (x_coord[0] == x_coord[1])) //символы находятся в одном столбце
                        {
                            message[first_letter_ind]  = playfair[columns * ((y_coord[0] - 1 + rows) % rows) + x_coord[0]];
                            message[second_letter_ind] = playfair[columns * ((y_coord[1] - 1 + rows) % rows) + x_coord[1]];
                        }
                        if ((y_coord[0] != y_coord[1]) && (x_coord[0] != x_coord[1])) //символы образуют прямоугольник
                        {
                            message[first_letter_ind]  = playfair[columns * y_coord[0] + x_coord[1]];
                            message[second_letter_ind] = playfair[columns * y_coord[1] + x_coord[0]];
                        }
                        //Конец зашифрования пары символов
                        pair_found = 0;
                    }
                }
            }
            for (int i = 0; i < message.Length; i++)
            {
                if (isUpper[i] == 1)
                {
                    message[i] = ALF[alf.IndexOf(message[i])];
                }
            }
            f10_fieldOriginal.Text = new string(message);

            metka_exit :;
        }
Example #5
0
        private void f15_buttonFindKeyLength_Click(object sender, EventArgs e)
        {
            f15_keyLengthUpDown.Value = 0;  //Сброс предыдущего результата
            if (f15_comboBoxMethods.Text == "Метод индекса совпадений" && f15_fieldCiphertext.TextLength > 0)
            {
                int possibleLength = 1;
                while (possibleLength < 50)
                {
                    string Source     = (f15_fieldCiphertext.Text).ToLower();
                    string everyXsymb = ""; // Формируем строку БЕЗ УЧЕТА РАЗДЕЛИТЕЛЕЙ из каждого х-того символа, где х = possibleLength
                    int    j          = 0;
                    for (int i = 0; i < Source.Length; i++)
                    {
                        if (j % possibleLength == 0 && (alf.IndexOf(Source[i]) != -1 || ALF.IndexOf(Source[i]) != -1)) //буква, нужная по номеру
                        {
                            everyXsymb += Source[i];
                            j++;
                        }
                        else if (j % possibleLength != 0 && (alf.IndexOf(Source[i]) != -1 || ALF.IndexOf(Source[i]) != -1)) //буква, не нужная по номеру
                        {
                            j++;
                        }
                    }

                    //Подсчитаем индекс
                    double index = 0;
                    int[]  times = new int[alf.Length];
                    Array.Clear(times, 0, alf.Length);
                    //Вычислим количество вхождений каждой буквы
                    int amount = 0;
                    for (int i = 0; i < everyXsymb.Length; i++)
                    {
                        if (alf.IndexOf(everyXsymb[i]) >= 0)
                        {
                            amount++;
                            times[alf.IndexOf(everyXsymb[i])]++;
                        }
                    }
                    for (int i = 0; i < times.Length; i++)
                    {
                        index += (times[i]) * (times[i] - 1);
                    }
                    index = index / (double)(amount * (amount - 1));
                    if (index > 0.0553)
                    {
                        f15_keyLengthUpDown.Value = possibleLength;
                        goto metka_exit;
                    }

                    possibleLength++;
                }
                metka_exit :;
            }
            if (f15_comboBoxMethods.Text == "Автокорреляционный метод" && f15_fieldCiphertext.TextLength > 0)
            {
                string Source = (f15_fieldCiphertext.Text).ToLower();
                for (int i = 0; i < Source.Length; i++) //Удаляем разделители
                {
                    if (alf.IndexOf(Source[i]) < 0)
                    {
                        string tmpDel = "";
                        tmpDel += Source[i];
                        Source  = Source.Replace(tmpDel, "");
                    }
                }
                for (int possibleLength = 1; possibleLength < 50; possibleLength++)
                {
                    string copySource   = Source.Substring(possibleLength) + Source.Substring(0, possibleLength);
                    int    coincidences = 0;
                    for (int i = 0; i < Source.Length; i++)
                    {
                        if (Source[i] == copySource[i])
                        {
                            coincidences++;
                        }
                    }
                    double index = coincidences / (double)Source.Length;
                    if (index > 0.0553)
                    {
                        f15_keyLengthUpDown.Value = possibleLength;
                        break;
                    }
                }
            }
            if (f15_comboBoxMethods.Text == "Тест Казиски" && f15_fieldCiphertext.TextLength > 0)
            {
                string Source = (f15_fieldCiphertext.Text).ToLower();
                for (int i = 0; i < Source.Length; i++) //Удаляем разделители
                {
                    if (alf.IndexOf(Source[i]) < 0)
                    {
                        string tmpDel = "";
                        tmpDel += Source[i];
                        Source  = Source.Replace(tmpDel, "");
                    }
                }
                if (Source.Length < 10)
                {
                    goto metka_exit;              //Для работы нужен достаточно длинный текст
                }
                string     checked_sublines = ""; //В эту строку через пробел будем записывать проверенные строки
                List <int> possibleLengths  = new List <int>();
                //если индекс в ней -1 то можно проверять, иначе - не надо
                for (int i = 0; i < Source.Length / 3 - 1; i++)
                {
                    string subline = Source.Substring(i, 3);
                    if (checked_sublines.IndexOf(subline) == -1)
                    {
                        //Считаем количество вхождений подстроки
                        int times = 0;
                        int j     = 0;
                        while (Source.IndexOf(subline, j) != -1)
                        {
                            j = Source.IndexOf(subline, j) + 1; //Следующий поиск начнем после текущего вхождения
                            times++;
                        }
                        ;
                        if (times >= 3)
                        {
                            checked_sublines += subline + " ";
                            List <int> positionsDifference = new List <int>();
                            int        prev = Source.IndexOf(subline); //первое вхождение
                            j = prev + 1;                              //начнем поиск со второго
                            while (Source.IndexOf(subline, j) != -1)
                            {
                                int curIndex = Source.IndexOf(subline, j);
                                positionsDifference.Add(curIndex - 1);
                                prev = curIndex;
                                j    = curIndex + 1;
                            }
                            ;
                            int curGCD = positionsDifference[0];
                            for (int k = 1; k < positionsDifference.Count; k++)
                            {
                                curGCD = GCD(curGCD, positionsDifference[k]);
                            }
                            if (curGCD > 1)
                            {
                                possibleLengths.Add(curGCD);
                            }
                        }
                    }
                }
                if (possibleLengths.Count > 0)
                {
                    possibleLengths.Sort();
                    int[] possibility = new int[50];
                    int   i           = 0;
                    while (i < possibleLengths.Count() && possibleLengths[i] < 50)
                    {
                        possibility[possibleLengths[i]]++;
                        i++;
                    }
                    for (i = 0; i < 50; i++)
                    {
                        possibility[i] = possibility[i] * i;    //Уменьшим значимость ложных срабатываний
                    }
                    for (i = 0; i < 50; i++)
                    {
                        if (possibility[i] == possibility.Max())
                        {
                            f15_keyLengthUpDown.Value = i;
                        }
                    }
                }
                metka_exit :;
            }
        }