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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.64
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
#1

Перестановочный шифр с ключевым словом - C++

21.10.2010, 11:50. Просмотров 7526. Ответов 15

Помогите, нужно сделать программу что будет зашифровывать и расшифровывать текст с помощью перестановочного шифра.

Буквы открытого текста записываются в клетки прямоугольной таблицы по ее строчкам.
Буквы ключевого слова пишутся над столбцами и указывают порядок этих столбцов (по возрастанию номеров букв в алфавите).
Чтобы получить зашифрованный текст, надо выписывать буквы по столбцам с учетом их нумерации:
Открытый текст: Прикладная математика
Ключ: Шифр

Ш и ф р
4 1 3 2
П р и к
л а д н
а я м а
т е м а
т и к а

Криптограмма: Раяеикнаааидммкплатт

Ключевое слово(последовательность столбцов) известно адресату, который легко сможет расшифровать сообщение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2010, 11:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перестановочный шифр с ключевым словом (C++):

Перестановочный шифр. - C++
На основе этого мне нужно написать рабочий код на С++. Материал прочитан на несколько раз и уже выдвинуто множество идей, код пишется, но...

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

Как зашифровать текст из файла шифрованием Цезаря с ключевым словом? - C++
в общем дан текст в файле.Нужно зашифровать его, например, с помощью кода Ascii, и записать в другой файл. нет даже предположений, так как...

Как заполнить переменную типа WCHAR предложением путем добавления словом за словом? - C++
Здравствуйте! Не могу понять, как заполнить переменную типа WCHAR предложением путем добавления словом за словом? Все таки придется...

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

Обработка данных в файле по ключевым словам - C++
Доброго времени суток, уважаемые пользователи форума! Подробное описание задачи: Дан текстовый файл, который содержит объекты -...

15
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
21.10.2010, 14:32 #2
В чём собсно нужна помощь ? Что уже сделали ? Что не работает ?
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
21.10.2010, 15:01 #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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "stdafx.h"
#include <string>
#include <iostream>
    
void permutationcode(std::string& text, std::string& const key)
{
    int col = key.size();
    int row = (text.size() % col) ? ((text.size() / col) + 1) : (text.size() / col);
    
    int** arrtext = new int*[row];
    for (int i = 0; i < row; ++i)
        arrtext[i] = new int[col];
 
    //inizialization array {0}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            arrtext[i][j] = 0;
 
    //fill array {text[i]}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            arrtext[i][j] = text[(i*col)+j];
        
 
    int index = 0;
    //permutation
    for (int i = 0; i < 256; ++i)
        for (int j = 0; j < key.size(); ++j)
            if (key[j] == i)
                for (int k = 0; k < row; ++k){
                    text[index] = arrtext[k][j];
                    ++index;
                }
 
        for (int i = 0; i < row; ++i)
             delete[] arrtext[i];
             delete[] arrtext;
}
 
/*
Помогите, нужно сделать программу что будет зашифровывать и расшифровывать текст с помощью перестановочного шифра.
Буквы открытого текста записываются в клетки прямоугольной таблицы по ее строчкам. 
Буквы ключевого слова пишутся над столбцами и указывают порядок этих столбцов (по возрастанию номеров букв в алфавите). 
Чтобы получить зашифрованный текст, надо выписывать буквы по столбцам с учетом их нумерации:
*/
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string text("Hello programmers!");
    std::string key("bac");
 
    std::cout << "Text before: " << text << std::endl << std::endl;
    permutationcode(text,key);
    std::cout << "Text after:  " << text << std::endl;
 
    std::cin.get();
    return 0;
}
0
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
26.10.2010, 23:13  [ТС] #4
Код работает, но могу я попросить чтобы он не только зашифровывал но и расшифровывал текст, и чтобы текст был не в коде программы, а чтобы его можно было вводить вручную.Помогите пожалуйста, а просто вообще не шарю, а очень надо(
1
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.10.2010, 18:03 #5
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "stdafx.h"
#include <string>
#include <iostream>
    
void permutationcode(std::string& text, std::string& const key)
{
    int col = key.size();
    int row = (text.size() % col) ? ((text.size() / col) + 1) : (text.size() / col);
    
    int** arrtext = new int*[row];
    for (int i = 0; i < row; ++i)
        arrtext[i] = new int[col];
 
    //inizialization array {0}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            arrtext[i][j] = 0;
 
    //fill array {text[i]}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            arrtext[i][j] = text[(i*col)+j];
        
 
    int index = 0;
    //permutation
    for (int i = 0; i < 256; ++i)
        for (int j = 0; j < col; ++j)
            if (key[j] == i)
                for (int k = 0; k < row; ++k,++index)
                    text[index] = arrtext[k][j];    
 
    for (int i = 0; i < row; ++i)
      delete[] arrtext[i];
      delete[] arrtext; 
}
 
 
void permutationdecode(std::string& text, const std::string& const key)
{
    int col = key.size();
    int row = (text.size() % col) ? ((text.size() / col) + 1) : (text.size() / col);
 
    int** arrtext = new int*[row];
    for (int i = 0; i < row; ++i)
        arrtext[i] = new int[col];
 
    //inizialization array {0}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
            arrtext[i][j] = 0;
 
    //fill array {text[i]}
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < col; ++j)
                arrtext[i][j] = text[(j*row)+i];
    
    int index = 0;
    //decode
    for (int i = 0; i < row; ++i){
        for (int k = 0; k < 256; ++k){
            for (int j = 0; j < col; ++j){
                if (key[j] == k){
                    text[index] = arrtext[i][j];
                    ++index;
                    break;
                }
            }
        }
    }
 
    for (int i = 0; i < row; ++i)
      delete[] arrtext[i];
      delete[] arrtext; 
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string text("Hello programmers!");
    std::string key("bac");
 
    std::cout << "Text before: " << text << std::endl << std::endl;
    permutationcode(text,key);
    std::cout << "Coded text:  " << text << std::endl << std::endl;
 
    permutationdecode(text,key);
    std::cout << "Decoded text: " << text;
 
    std::cin.get();
    std::cin.get();
    return 0;
}
а ввод строки так
C++
1
2
3
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
Добавлено через 1 минуту
или
C++
1
getline()
0
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
27.10.2010, 23:10  [ТС] #6
Спасибо огромное за помощь!!!Очень выручил.
0
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 659
28.10.2010, 00:53 #7
Спасибо очень полезная программа а почему при компиляции выдается ошибка:
Error 1 fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory c:\users\администратор\documents\visual studio 2008\projects\c++\console\p542\p542\p542.cpp 1 p542?

Среда разработки Visual Studio 2008
0
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 659
28.10.2010, 01:10 #8
Убрал #include "stdafx.h" компилятор снова ругается:
Warning 1 warning C4227: anachronism used : qualifiers on reference are ignored c:\users\администратор\documents\visual studio 2008\projects\c++\console\p543\p543\p543.cpp 5 p543
Warning 2 warning C4227: anachronism used : qualifiers on reference are ignored c:\users\администратор\documents\visual studio 2008\projects\c++\console\p543\p543\p543.cpp 39 p543
Error 3 error C2061: syntax error : identifier '_TCHAR' c:\users\администратор\documents\visual studio 2008\projects\c++\console\p543\p543\p543.cpp 79 p543
Среда разработки VS2008
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.10.2010, 01:19 #9
isaak, а вы код скопировали просто целиком?
0
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 659
28.10.2010, 01:29 #10
С 1 - 94 строки, только вот не понятно а куда вставить:
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.10.2010, 01:32 #11
Цитата Сообщение от isaak Посмотреть сообщение
С 1 - 94 строки
"stdafx.h" может поэтому и не находится, потому что скопировали полностью

Добавлено через 24 секунды
Цитата Сообщение от isaak Посмотреть сообщение
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
в _tmain в начало - ну обычный вввод переменной
0
Lord_Rufus
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
12.03.2011, 14:45 #12
Скинте исходник, не могу сделать
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.03.2011, 15:45 #13
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/////////////////////////////////////////////////////////////////////////////////////////
//нужно сделать программу что будет зашифровывать и расшифровывать текст с помощью 
//перестановочного шифра.
//
//Буквы открытого текста записываются в клетки прямоугольной таблицы по ее строчкам.
//Буквы ключевого слова пишутся над столбцами и указывают порядок этих столбцов 
//(по возрастанию номеров букв в алфавите).
//Чтобы получить зашифрованный текст, надо выписывать буквы по столбцам с учетом их нумерации:
//Открытый текст: прикладная математика
//Ключ: Шифр
//
//Ш и ф р
//4 1 3 2
//П р и к
//л а д н
//а я м а
//т е м а
//т и к а
//
//Криптограмма: раяеикнаааидммкплатт
//
//Ключевое слово(последовательность столбцов) известно адресату, который легко сможет 
//расшифровать сообщение.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <iostream>
#include <locale>
#include <map>
#include <set>
#include <string>
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                         T_str;
typedef std::map<T_str::value_type, T_str>  T_key_symb_cols;
typedef std::set<T_str::value_type>         T_char_set;
/////////////////////////////////////////////////////////////////////////////////////////
T_str  from_DOS(T_str  DOS_string)
{    
    T_str::value_type buf[1000000];   
    OemToCharA(DOS_string.c_str(), buf);
    return buf;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  remove_spaces(const T_str&  s)
{    
    struct  T_is_rus_space
    {
        bool  operator() (T_str::value_type  c)
        {
            return  std::isspace(c, std::locale(""));
        }
    };
    T_str  s_res;
    std::remove_copy_if(s.begin(), s.end(), std::back_inserter(s_res), T_is_rus_space());
    return  s_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  encode
    (
        const T_str&  sss, 
        const T_str&  key
    )
{
    T_str            s = remove_spaces(sss);    
    T_key_symb_cols  key_symb_cols;
 
    for(T_str::size_type  pos = 0; pos < s.length();)    
    {
        for(T_str::const_iterator  key_symb_it = key.begin();
            key_symb_it != key.end(); ++key_symb_it)
        {            
            key_symb_cols[*key_symb_it] += s[pos++];
            if(pos == s.length())  break;
        }        
    }
 
    struct  T_get_code_str
    {
        T_str  coded_str_;
        //-------------------------------------------------------------------------------
        void  operator() (const T_key_symb_cols::value_type&  key_symb_cols_elem)
        {
            coded_str_ += key_symb_cols_elem.second;
        }
        //-------------------------------------------------------------------------------
        operator T_str()
        {
            return  coded_str_;
        }
    };
    return  std::for_each(key_symb_cols.begin(), key_symb_cols.end(), T_get_code_str());
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  decode
    (
        T_str         coded_s, 
        const T_str&  key
    )
{
    int    col_len   = int(ceil(double(coded_s.length()) / key.length()));
    int    tail_len  = coded_s.length() % key.length();
    T_str  short_cols_symbols;
    if(tail_len)
    {        
        short_cols_symbols  = key.substr(tail_len);
    }    
    T_char_set  short_cols_symbols_set(short_cols_symbols.begin(), short_cols_symbols.end());
    
    T_char_set       sort_key(key.begin(), key.end());
    T_key_symb_cols  key_symb_cols;
    for(T_char_set::const_iterator  sort_key_symb_it = sort_key.begin();
        sort_key_symb_it != sort_key.end(); ++sort_key_symb_it)
    {            
        int  symb_col_len = col_len;
        if(short_cols_symbols_set.count(*sort_key_symb_it))
        {
            --symb_col_len;
        }        
        key_symb_cols[*sort_key_symb_it] = coded_s.substr(0, symb_col_len);
        coded_s.erase(0, symb_col_len);
    }
 
    T_str  s_res;
        
    for(;;)    
    {
        for(T_str::const_iterator  key_symb_it = key.begin();
            key_symb_it != key.end(); ++key_symb_it)
        {
            if(key_symb_cols[*key_symb_it].empty())  return  s_res;
            s_res += key_symb_cols[*key_symb_it][0];
            key_symb_cols[*key_symb_it].erase(0, 1);
        }        
    }    
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  key_is_valid(const T_str&  key)
{
    T_char_set  key_set(key.begin(), key.end());
    return  key_set.size() == key.size();
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    std::locale::global(std::locale(""));
    T_str  key;
    
    do
    {
        std::cout << "Введите ключевое слово без повторяющихся букв: ";                  
        T_str  DOS_key;
        std::cin >> DOS_key;
        key = from_DOS(DOS_key);
    }while(!key_is_valid(key));
    
    std::cin.ignore();
 
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << "Введите строку: "
                  << std::endl;
        T_str  DOS_s;         
        getline(std::cin, DOS_s);
        if(DOS_s.empty()) break;
        T_str  s = from_DOS(DOS_s);
        T_str  coded_s = encode(s, key);
        std::cout << std::endl
                  << "Зашифрованная строка: "
                  << std::endl
                  << coded_s;
        T_str  decoded_s = decode(coded_s, key);
        std::cout << std::endl
                  << std::endl
                  << "Расшифрованная строка: "
                  << std::endl
                  << decoded_s
                  << std::endl;        
    }
}
1
Lord_Rufus
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
14.03.2011, 14:26 #14
сделал в консоли на C++ билдере, но экзешник не заработал на другом компе (. (ошибка была чтото типа какойто там файл.dll не был найден) кто знает че за ошибка?
0
Nice Plant
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 7
19.11.2012, 21:48 #15
Доброго времени суток. Интересует вопрос, как написать взломщик к этому алгоритму?)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 21:48
Привет! Вот еще темы с ответами:

Реализовать поиск данных по ключевым словам на компьютере и в интернете - C++
Получится ли написать программу с интерфэйсом?Ну что-то пишешь,а она отвечает ну или по словам находит то что нужно или в компе или в...

Операции со словом - C++
Дано слово.Если оно четной длины, то удалите 2-ю половину слова,а первую переверните. Если слово нечетной длины, то удалите средний...

программа с работой над словом - C++
Помогите написать программу чтобы в начале выдавала все буквы алфавита и посли того как вбить слово она его делила на 3 раздела гласные...

Как сравнить строку со словом - C++
Добрый день. Программа попросила ввести строку, я ввёл. Дальше программа сравнивает введённую строку с фиксированным значением &quot;logN&quot; и...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
19.11.2012, 21:48
Ответ Создать тему
Опции темы

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