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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
#1

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

19.10.2013, 00:20. Просмотров 2083. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2013, 00:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифр Виженера, непонятки с работой формулы (C++):

Шифр Виженера на C++ - C++
Помогите пожалуйста с заданием. От вас зависит стипендия в течении семестра. Рабочее задание: Реализовать программно шифр Виженера...

Шифр Виженера - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sstream&gt; #include...

Шифр Виженера c++ - C++
Шифр Виженера c++

Шифр Виженера - C++
У кого есть исходник на Си ?

Шифр Виженера - C++
Надо написать программу на С++, расшифровывающую сообщение, зашифрованное шифром Виженера. Слово-ключ не дано. То есть сначала надо...

Шифр Виженера, добавить дешифрование - C++
Шифр Виженера, С++, дешифрование Есть программа, которая зашифровывает, нужно доделать ее так, чтобы она еще и расшифровывала ...

3
FiLF
53 / 53 / 15
Регистрация: 05.09.2013
Сообщений: 1,425
19.10.2013, 03:17 #2
Формула работает. Вы изменили алфавит - изменился зашифрованный текст (хотя исходное сообщение осталось прежнее). Попробуйте нарисовать квадрат Виженера и выполнить шифрование вручную.
1
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
19.10.2013, 16:50  [ТС] #3
Цитата Сообщение от FiLF Посмотреть сообщение
Формула работает. Вы изменили алфавит - изменился зашифрованный текст (хотя исходное сообщение осталось прежнее). Попробуйте нарисовать квадрат Виженера и выполнить шифрование вручную.
Попробую! Но, если расширить таблицу Виженера
Шифр Виженера, непонятки с работой формулы
То ведь не должен измениться шифр у значений старой части таблицы.
 Комментарий модератора 
Выкладывайте картинки на сам форум.
0
FiLF
53 / 53 / 15
Регистрация: 05.09.2013
Сообщений: 1,425
21.10.2013, 11:06 #4
Цитата Сообщение от FliXis Посмотреть сообщение
Попробую! Но, если расширить таблицу Виженера
http://cs416229.vk.me/v416229130/45db/CiByjOOt3Cg.jpg
То ведь не должен измениться шифр у значений старой части таблицы.
Нет, исходная таблица не является частью расширенной.
1
21.10.2013, 11:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 11:06
Привет! Вот еще темы с ответами:

Шифр Виженера: переписать код так, чтобы программа не только зашифровала, но и расшифровала текст - C++
Текст он зашифрует но не расшифрует. А как сделать чтобы он зашифровал и расшифровал текст??? #include &quot;stdafx.h&quot; #include &lt;ctime&gt; ...

Расшифровать шифр Виженера с несколькими ключами - C++
Добрый вечер. Не могу понять, как можно расшифровать шифр Виженера, если имеются 3 ключа. Задание: Не могу понять, как это...

Шифр Вижиненра, шифр скитала - C++
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать. Кому интересно, напишите мне примеры этих...

Шифрование методом Виженера - C++
Ребята есть код, помогите разобраться с неправильным выводом зашифрованного текста, вместо русских букв выводит зашифрованный текст с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.