Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сортировка внутри сортировки http://www.cyberforum.ru/cpp-beginners/thread981310.html
Необходимо отсортировать структуру студент по группам а потом по ФИО. по группам сортирует а по ФИО уже нет, подскажите где косячу struct student { char FIO; int group; } ; template...
C++ Формирование и просмотр списка и функция, которая изменяет каждое значение информационной части элемента списка на его квадрат Написать программу, содержащую процедуры формирования и просмотра списка и функцию, которая изменяет каждое значение информационной части элемента списка на его квадрат. http://www.cyberforum.ru/cpp-beginners/thread981302.html
C++ Определить, есть ли в заданном массиве мажоруючий элемент
Мажоруючим элементом массива A назовем элемент, который встречается в NN / 2 массиве более раз. Определить, есть ли в заданном массиве мажоруючий элемент, и если есть, то указать его и его номер....
Передача массива C++
massiv.cpp int * peredacha() { int mas; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) mas = j; return *mas; }
C++ Двоичные файлы http://www.cyberforum.ru/cpp-beginners/thread981264.html
Здравствуйте. Кому не сложно, помогите, пожалуйста, решить задачу. Не забуду сказать "спасибо". "Для заданного двоичного файла записать два новых файла. Первый содержит нечётные байты исходного,...
C++ Структуры # include <iostream> #include <iostream> #include <conio.h> #include <string.h> using namespace std; struct Biblio { char pib; int kafedra; int kolvo; подробнее

Показать сообщение отдельно
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180

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

19.10.2013, 00:20. Просмотров 2056. Ответов 3
Метки (Все метки)

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> я понимаю, что сама реализация хромает на обе ноги, но суть не в этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru