Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/117: Рейтинг темы: голосов - 117, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10

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

21.10.2010, 11:50. Показов 22104. Ответов 16

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

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

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

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

Ключевое слово(последовательность столбцов) известно адресату, который легко сможет расшифровать сообщение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.10.2010, 11:50
Ответы с готовыми решениями:

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

Работа с ключевым словом const
Всем мира! Снова приходится обращаться к вам, дорогие форумчане за разъяснением вот какой штуки. Сейчас изучаю Эффективное Использование...

Различие между оператором new и ключевым словом new
Решая эту задачу https://stepik.org/lesson/563/step/7?unit=886 набрёл на статью которая меня очень заинтересовала...

16
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
21.10.2010, 14:32
В чём собсно нужна помощь ? Что уже сделали ? Что не работает ?
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
21.10.2010, 15:01
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
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
26.10.2010, 23:13  [ТС]
Код работает, но могу я попросить чтобы он не только зашифровывал но и расшифровывал текст, и чтобы текст был не в коде программы, а чтобы его можно было вводить вручную.Помогите пожалуйста, а просто вообще не шарю, а очень надо(
1
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
27.10.2010, 18:03
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
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
27.10.2010, 23:10  [ТС]
Спасибо огромное за помощь!!!Очень выручил.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
28.10.2010, 00:53
Спасибо очень полезная программа а почему при компиляции выдается ошибка:
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
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
28.10.2010, 01:10
Убрал #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
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
28.10.2010, 01:19
isaak, а вы код скопировали просто целиком?
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
28.10.2010, 01:29
С 1 - 94 строки, только вот не понятно а куда вставить:
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
28.10.2010, 01:32
Цитата Сообщение от isaak Посмотреть сообщение
С 1 - 94 строки
"stdafx.h" может поэтому и не находится, потому что скопировали полностью

Добавлено через 24 секунды
Цитата Сообщение от isaak Посмотреть сообщение
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
в _tmain в начало - ну обычный вввод переменной
0
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
12.03.2011, 14:45
Скинте исходник, не могу сделать
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.03.2011, 15:45
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;        
    }
}
2
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
14.03.2011, 14:26
сделал в консоли на C++ билдере, но экзешник не заработал на другом компе (. (ошибка была чтото типа какойто там файл.dll не был найден) кто знает че за ошибка?
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 7
19.11.2012, 21:48
Доброго времени суток. Интересует вопрос, как написать взломщик к этому алгоритму?)
0
 Аватар для Юрий Владимиров
53 / 53 / 5
Регистрация: 06.04.2013
Сообщений: 178
17.10.2014, 02:03
PointsEqual, Ваш код работает только иногда!
например:
C++
1
2
std::string text("test this is");
std::string key("lksd");
выводит полный бред! очень жаль, много времени убил, думал что у меня ошибка.
дело в выходе за границы, возм неверном построении.

Добавлено через 8 минут
кодирование работает, но вот расшифровка, самое основное, нет...
0
0 / 0 / 0
Регистрация: 25.02.2022
Сообщений: 1
25.02.2022, 18:06
Mr.X, Если ты все еще обитаешь тут, подскажи что необходимо поменять в коде чтобы была возможность использовать слово
К р и п т о г р а ф и я
5 8 3 7 10 6 2 9 1 11 4 12
Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2022, 18:06
Помогаю со студенческими работами здесь

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

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

Скажите, почему нельзя полностью отказаться от char, при этом сделав string стандартным ключевым словом языка?
Скажите,почему нельзя полностью отказаться от char,при этом сделав string стандартным ключевым словом языка? char жутко неудобен при...

Перестановочный шифр с ключевым словом
Здравствуйте, помогите, пожалуйста, реализовать шифр. Перестановочный шифр с ключевым словом. Открытый текст: Прикладная...

Перестановочный шифр с ключевым словом
Здравствуйте, помогите, пожалуйста, написать программу : Перестановочный шифр с ключевым словом. Открытый текст: Прикладная математика ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru