Форум программистов, компьютерный форум CyberForum.ru

Шифр Виженера, непонятки с работой формулы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
19.10.2013, 00:20     Шифр Виженера, непонятки с работой формулы #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int main()
{
    //Текст, который необходимо зашифровать
    string text = "ATTACKATDAWN";
 
    //Ключ, которым шифруем текст
    string key = "LEMONLEMONLE";
 
    //Объявляем алфавитную доску
    int ASCII = 26; //Количество задействованных символов
    int beginASCII = 65; //Инициализируем первым символом 'A'
    unsigned char alphabetBoard[ASCII]; //Размер доски - промежуток между(включая) 65 и 90 ASCII
    for(int i = 0; i < ASCII; i++) alphabetBoard[i] = (char) beginASCII++; //Инициализируем доску значениями
 
    //Бежим по алфавитной доске и сравниваем значения
    for(int j = 0; j < text.length(); j++)
    {
        //Поиск буквы текста в алфавите
        for(int i = 0; i < ASCII; i++)
        {
            if(alphabetBoard[i] == text[j])
            {
                //Если нашли, переходим к ключу
                for(int n = 0; n < ASCII; n++)
                {
                    //Поиск буквы ключа в алфавите
                    if(alphabetBoard[n] == key[j])
                    {
                        //Если нашли переходим к выявлению шифро-буквы
                        int cryptLetter = (i + n) % ASCII; //Индекс буквы текста + индекс ключа % на алфавит
                        cout << alphabetBoard[cryptLetter]; //Печать шифро-буквы
                        break;
                    }
                }
            }
        }
    }
 
    return 0;
}
Правильность работы проверяю по эталону с виккипедии:
Исходный текст: ATTACKATDAWN
Ключ: LEMONLEMONLE
Зашифрованный текст: LXFOPVEFRNHR
В данном случае он отрабатывает верно.
Меняю условие в 9-10 строке:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int main()
{
    //Текст, который необходимо зашифровать
    string text = "ATTACKATDAWN";
 
    //Ключ, которым шифруем текст
    string key = "LEMONLEMONLE";
 
    //Объявляем алфавитную доску
    int ASCII = 223; //Количество задействованных символов
    int beginASCII = 33; //Инициализируем первым символом '!'
    unsigned char alphabetBoard[ASCII]; //Размер доски - промежуток между(включая) 33 и 255 ASCII
    for(int i = 0; i < ASCII; i++) alphabetBoard[i] = (char) beginASCII++; //Инициализируем доску значениями
 
    //Бежим по алфавитной доске и сравниваем значения
    for(int j = 0; j < text.length(); j++)
    {
        //Поиск буквы текста в алфавите
        for(int i = 0; i < ASCII; i++)
        {
            if(alphabetBoard[i] == text[j])
            {
                //Если нашли, переходим к ключу
                for(int n = 0; n < ASCII; n++)
                {
                    //Поиск буквы ключа в алфавите
                    if(alphabetBoard[n] == key[j])
                    {
                        //Если нашли переходим к выявлению шифро-буквы
                        int cryptLetter = (i + n) % ASCII; //Индекс буквы текста + индекс ключа % на алфавит
                        cout << alphabetBoard[cryptLetter]; //Печать шифро-буквы
                        break;
                    }
                }
            }
        }
    }
 
    return 0;
}
Теперь доска не 26 символов, а 223. И запись в массив не с A(65), а с !(33) т.е. захотел расширить доску до кирилицы, включая часть спец-символов и оба регистра.
Получаю:
Исходный текст: ATTACKATDAWN
Ключ: LEMONLEMONLE
Зашифрованный текст: lxAopveArnBr
т.е. во первых почти все в нижнем регистре, во вторых - там где большие A - это все не верно.
Попробовал в джаве - там вот эти вот большие А вообще не отображаются, а большая B является запятой.

Почему из-за расширения таблицы перестает работать формула?
P.S> я понимаю, что сама реализация хромает на обе ноги, но суть не в этом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2013, 00:20     Шифр Виженера, непонятки с работой формулы
Посмотрите здесь:

C++ Шифрование шифра Виженера
C++ Шифр Виженера
C++ Шифрование Методом Виженера На C++
Шифр Виженера C++
Шифрование методов Виженера ДЛЯ РУССКИХ БУКВ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FiLF
52 / 52 / 15
Регистрация: 05.09.2013
Сообщений: 1,088
19.10.2013, 03:17     Шифр Виженера, непонятки с работой формулы #2
Формула работает. Вы изменили алфавит - изменился зашифрованный текст (хотя исходное сообщение осталось прежнее). Попробуйте нарисовать квадрат Виженера и выполнить шифрование вручную.
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
19.10.2013, 16:50  [ТС]     Шифр Виженера, непонятки с работой формулы #3
Цитата Сообщение от FiLF Посмотреть сообщение
Формула работает. Вы изменили алфавит - изменился зашифрованный текст (хотя исходное сообщение осталось прежнее). Попробуйте нарисовать квадрат Виженера и выполнить шифрование вручную.
Попробую! Но, если расширить таблицу Виженера
Шифр Виженера, непонятки с работой формулы
То ведь не должен измениться шифр у значений старой части таблицы.
 Комментарий модератора 
Выкладывайте картинки на сам форум.
FiLF
52 / 52 / 15
Регистрация: 05.09.2013
Сообщений: 1,088
21.10.2013, 11:06     Шифр Виженера, непонятки с работой формулы #4
Цитата Сообщение от FliXis Посмотреть сообщение
Попробую! Но, если расширить таблицу Виженера
http://cs416229.vk.me/v416229130/45db/CiByjOOt3Cg.jpg
То ведь не должен измениться шифр у значений старой части таблицы.
Нет, исходная таблица не является частью расширенной.
Yandex
Объявления
21.10.2013, 11:06     Шифр Виженера, непонятки с работой формулы
Ответ Создать тему
Опции темы

Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru