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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.64
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
21.10.2010, 11:50     Перестановочный шифр с ключевым словом #1
Помогите, нужно сделать программу что будет зашифровывать и расшифровывать текст с помощью перестановочного шифра.

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

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

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

Ключевое слово(последовательность столбцов) известно адресату, который легко сможет расшифровать сообщение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
21.10.2010, 14:32     Перестановочный шифр с ключевым словом #2
В чём собсно нужна помощь ? Что уже сделали ? Что не работает ?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 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;
}
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
26.10.2010, 23:13  [ТС]     Перестановочный шифр с ключевым словом #4
Код работает, но могу я попросить чтобы он не только зашифровывал но и расшифровывал текст, и чтобы текст был не в коде программы, а чтобы его можно было вводить вручную.Помогите пожалуйста, а просто вообще не шарю, а очень надо(
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 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()
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
27.10.2010, 23:10  [ТС]     Перестановочный шифр с ключевым словом #6
Спасибо огромное за помощь!!!Очень выручил.
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
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
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
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
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.10.2010, 01:19     Перестановочный шифр с ключевым словом #9
isaak, а вы код скопировали просто целиком?
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
28.10.2010, 01:29     Перестановочный шифр с ключевым словом #10
С 1 - 94 строки, только вот не понятно а куда вставить:
std::string text;
std::cout << "Enter text: ";
std:cin >> text;
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 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 в начало - ну обычный вввод переменной
Lord_Rufus
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
12.03.2011, 14:45     Перестановочный шифр с ключевым словом #12
Скинте исходник, не могу сделать
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
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;        
    }
}
Lord_Rufus
0 / 0 / 0
Регистрация: 27.04.2008
Сообщений: 24
14.03.2011, 14:26     Перестановочный шифр с ключевым словом #14
сделал в консоли на C++ билдере, но экзешник не заработал на другом компе (. (ошибка была чтото типа какойто там файл.dll не был найден) кто знает че за ошибка?
Nice Plant
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 7
19.11.2012, 21:48     Перестановочный шифр с ключевым словом #15
Доброго времени суток. Интересует вопрос, как написать взломщик к этому алгоритму?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2014, 02:03     Перестановочный шифр с ключевым словом
Еще ссылки по теме:

Шифр Вижиненра, шифр скитала C++
C++ Как заполнить переменную типа WCHAR предложением путем добавления словом за словом?
Как сравнить строку со словом C++

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

Или воспользуйтесь поиском по форуму:
Юрий Владимиров
 Аватар для Юрий Владимиров
51 / 51 / 2
Регистрация: 06.04.2013
Сообщений: 178
17.10.2014, 02:03     Перестановочный шифр с ключевым словом #16
PointsEqual, Ваш код работает только иногда!
например:
C++
1
2
std::string text("test this is");
std::string key("lksd");
выводит полный бред! очень жаль, много времени убил, думал что у меня ошибка.
дело в выходе за границы, возм неверном построении.

Добавлено через 8 минут
кодирование работает, но вот расшифровка, самое основное, нет...
Yandex
Объявления
17.10.2014, 02:03     Перестановочный шифр с ключевым словом
Ответ Создать тему

Метки
перестановочный шифр, шифрование
Опции темы

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