Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2024, 23:37   #1
LifelessCorpse
Новичок
Джуниор
 
Регистрация: 08.12.2024
Сообщений: 1
По умолчанию Шифр Плейфера C#

Шифр работает на русском и на английском, но дешифрование на русском проходит некорректно. Вот фрагмент кода для сдвига в таблице. Для латин. 5х5, для кирилл. 4х8
Код:
foreach (var bigram in bigrams)
{
    int row1 = FindCharRow(bigram[0]);
    int row2 = FindCharRow(bigram[1]);
    int col1 = FindCharCol(row1, bigram[0]);
    int col2 = FindCharCol(row2, bigram[1]);

    textBox3.Text += "|" + bigram.ToString();

    if (row1 != -1 && row2 != -1)
    {
        if (row1 == row2) // Если символы в одной строке
        {
            if (radioButtonRussian.Checked)
            {
                int shift = (col2 < col1) ? 1 : -1; // Сдвиг влево или вправо
                decrypted.Append(GetCharFromGrid(row1, (col1 + shift + 8) % 8));
                decrypted.Append(GetCharFromGrid(row2, (col2 + shift + 8) % 8));
            }
            else
            {
                int shift = (col2 > col1) ? 1 : -1; // Сдвиг влево или вправо
                decrypted.Append(GetCharFromGrid(row1, (col1 + shift + 5) % 5));
                decrypted.Append(GetCharFromGrid(row2, (col2 + shift + 5) % 5));
            }
        }
        else if (col1 == col2) // Если оба символа в одном столбце
        {
            if (radioButtonRussian.Checked)
            {
                int rowShift = (row1 > row2) ? -1 : 1; // Сдвиг вверх или вниз
                decrypted.Append(GetCharFromGrid((row1 + rowShift + 4) % 4, col1));
                decrypted.Append(GetCharFromGrid((row2 + rowShift + 4) % 4, col2));
            }
            else
            {
                int rowShift = (row1 > row2) ? -1 : 1; // Сдвиг вверх или вниз
                decrypted.Append(GetCharFromGrid((row1 + rowShift + 5) % 5, col1));
                decrypted.Append(GetCharFromGrid((row2 + rowShift + 5) % 5, col2));
        }
        else // Разные строки и столбцы
        {
            if (radioButtonRussian.Checked)
            {
                decrypted.Append(GetCharFromGrid(row1, col2));
                decrypted.Append(GetCharFromGrid(row2, col1));
            }
            else
            {
                decrypted.Append(GetCharFromGrid(row1, col2));
                decrypted.Append(GetCharFromGrid(row2, col1));
            }
        }
    }
}
LifelessCorpse вне форума Ответить с цитированием
Старый 09.12.2024, 06:35   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,394
По умолчанию

Вы rowShift выбираете одинаково для английского и русского, а вот shift по-разному. Хотя, думаю, дело не в этом. Откуда вообще взялся выбор направления сдвига? На википедии в описании шифра всегда берется сдвиг вправо или сдвиг вниз при шифровании (сдвиг влево или сдвиг вверх при дешифровании). А в вашем случае если при выборе символа происходит переход через границу таблицы, то при расшифровке будет выбран неверный сдвиг.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с шифром Плейфера Luchfan12 Общие вопросы Delphi 0 17.03.2015 01:22
Алгоритм Плейфера SKyzZz C# (си шарп) 2 18.09.2014 15:43
Программа шифрования на C++ методом плейфера Heecn Помощь студентам 0 17.01.2013 19:40
Реализация шифра Плейфера в Delphi ALUKARD2011 Помощь студентам 3 14.10.2011 15:56
Шифр Плейфера Kadett Свободное общение 5 11.08.2010 14:22