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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.71
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
#1

Шифр Альберти - C++

02.10.2011, 19:46. Просмотров 3780. Ответов 19
Метки нет (Все метки)

Нужен исходник шифрующий некоторое сообщение по шифру Альберти. Есть ли у кого-нибудь такой? В инете искал, ничего подходящего не нашел (.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2011, 19:46     Шифр Альберти
Посмотрите здесь:

Шифрование методом "Диск Альберти" - C++
Написать приложение для преобразования файлов с открытым сообщением в файлы с зашифрованным сообщением методом "Диск Альберти". У меня...

Шифр Вижинера - C++
Здравствуйте.Нужно написать шифр Вижинера с файлами,т.е. 1 файл-исходный текст,2ой зашифрованный,ну а ключ вводится в консоли.Длина...

Шифр Бэкона c++ - C++
Народ,помогите пожалуйста перевести шифр с паскаля на c++ :) program strug_production; var s_out, s_in, str,itogstroka,tekbukva:...

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

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

Аффинный шифр - C++
Здравствуйте. Мне необходимо провести кодирование и декодирование текста при использовании аффинного шифра. Я написал следующую программу: ...

Несложный шифр - C++
Здравтвуйте! Никак не могу придумать как реаоизовать данный "шифр": Дан файл с числами и файл с буквами. Каждой букве соответствует...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 21:21     Шифр Альберти #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот, набросал утилитку

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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
/* сгенерировать случайный шифроалфавит */
string generate_alphabet()
{
    string alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
 
    // это несколько.. некрасиво
    /*for( char i = ' '; i <= '~'; i++ )
       alphabet.append( 1, i );*/
 
    random_shuffle( alphabet.begin(), alphabet.end() );
 
    return alphabet;
}
 
/* загрузить набор шифроалфавитов из файла file_name,
   добавив их в конец набора шифроалфавитов sequence */
bool load_alphabets( const string &file_name, vector<string> &sequence )
{
    string buffer;
 
    ifstream fs( file_name );
 
    if( !fs.is_open() )
       return false;
 
    fs >> buffer;
 
    if( buffer != "{alberti_alphabets}" )
        return false;
 
    while( !fs.eof() )
    {
        getline( fs, buffer );
 
        if( buffer.length() )
           sequence.push_back( buffer );
    }
 
    fs.close();
    return true;
}
 
/* сохранить набор шифроалфавитов sequece в файл file_name */
bool save_alphabets( const string &file_name, const vector<string> &sequence )
{
    ofstream fs( file_name );
 
    if( !fs.is_open() )
       return false;
 
    fs << "{alberti_alphabets}\n";
 
    for( vector<string>::const_iterator it = sequence.begin(); it != sequence.end(); it++ )
       fs << *it << '\n';
 
    fs.close();
    return true;
}
 
/* засшифровать файл src_file_name, записав результат в dst_file_name,
   используя набор шифроалфавитов sequence */
bool encrypt( const string &src_file_name, const string &dst_file_name, const vector<string> &sequence )
{
    ifstream ifs( src_file_name );
    ofstream ofs( dst_file_name );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
 
        return false;
    }
 
    char ch;
    vector<string>::const_iterator alph_it = sequence.begin();
 
    while( !ifs.eof() )
    {
        ch = ifs.get();
 
        if( ch == EOF )
           break;
 
        ofs.put( ( (*alph_it).find( ch ) == string::npos ) ? ch : (*alph_it)[ ch - ' ' ] );
 
        alph_it++;
 
        if( alph_it == sequence.end() )
           alph_it = sequence.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
/* расшифровать файл src_file_name, записав результат в dst_file_name,
   используя набор шифроалфавитов sequence */
bool decrypt( const string &src_file_name, const string &dst_file_name, const vector<string> &sequence )
{
    ifstream ifs( src_file_name );
    ofstream ofs( dst_file_name );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
 
        return false;
    }
 
    char ch;
    size_t pos;
    vector<string>::const_iterator alph_it = sequence.begin();
 
    while( !ifs.eof() )
    {
        ch = ifs.get();
 
        if( ch == EOF )
           break;
 
        pos = (*alph_it).find( ch );
        ofs.put( pos == string::npos ? ch : pos + ' ' );
 
        alph_it++;
 
        if( alph_it == sequence.end() )
           alph_it = sequence.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
int main( )
{
    vector<string> alphabets; // шифроалфавиты
    string last_alphabet; // алфавит, который последний раз сгенерировала generate_alphabet
 
    string cmd; // введённая команда
 
    cout << "Alberti cypher utility v1.0\ntype help if you don't know what to do\n";
 
    // меню пользователя
    do
    {
        cout << "> ";
        cin >> cmd;
 
        if( cmd == "generate" )
        {
            last_alphabet = generate_alphabet();
            cout << last_alphabet << '\n';
        }
        else if( cmd == "push" )
        {
            if( !last_alphabet.length() )
               cout << "no alphabet in memory\n";
            else
            {
                alphabets.push_back( last_alphabet );
                cout << "alphabet sequence now contains " << alphabets.size() << " elements\n";
            }
        }
        else if( cmd == "print" )
        {
            for( vector<string>::iterator it = alphabets.begin();
                 it != alphabets.end(); it++ )
                     cout << *it << '\n';
 
            cout << "-- " << alphabets.size() << " alphabets\n";
        }
        else if( cmd == "erase" )
        {
            alphabets.clear();
            cout << "alphabet sequence is erased\n";
        }
        else if( cmd == "load" )
        {
            string fileName;
 
            cout << "current alphabet sequence will be appended with one that will be loaded from file\nfile name or \"#\" to abort> ";
            cin >> fileName;
 
            if( fileName == "#" )
               cout << "aborted.\n";
            else if( !load_alphabets( fileName, alphabets ) )
               cout << "failed.\n";
            else
               cout << "alphabet sequence now contains " << alphabets.size() << " elements\n";
        }
        else if( cmd == "save" )
        {
            string fileName;
 
            cout << "file name or \"#\" to abort> ";
            cin >> fileName;
 
            if( fileName == "#" )
               cout << "aborted.\n";
            else if( !save_alphabets( fileName, alphabets ) )
               cout << "failed.\n";
            else
               cout << "ok.\n";
        }
        else if( cmd == "encrypt" )
        {
            if( !alphabets.size() )
            {
                cout << "current alphabet sequence is empty\n";
                continue;
            }
 
            string srcFileName;
            string dstFileName;
 
            cout << "source file name or \"#\" to abort> ";
            cin >> srcFileName;
 
            if( srcFileName == "#" )
            {
               cout << "aborted.\n";
               continue;
            }
 
            cout << "destination file name or \"#\" to abort> ";
            cin >> dstFileName;
 
            if( dstFileName == "#" )
            {
               cout << "aborted.\n";
               continue;
            }
            else if( srcFileName == dstFileName )
               cout << "file names should not match\n";
            else if( !encrypt( srcFileName, dstFileName, alphabets ) )
               cout << "failed.\n";
            else
               cout << "ok.\n";
        }
        else if( cmd == "decrypt" )
        {
            if( !alphabets.size() )
            {
                cout << "current alphabet sequence is empty\n";
                continue;
            }
 
            string srcFileName;
            string dstFileName;
 
            cout << "source file name or \"#\" to abort> ";
            cin >> srcFileName;
 
            if( srcFileName == "#" )
            {
               cout << "aborted.\n";
               continue;
            }
 
            cout << "destination file name or \"#\" to abort> ";
            cin >> dstFileName;
 
            if( dstFileName == "#" )
            {
               cout << "aborted.\n";
               continue;
            }
            else if( srcFileName == dstFileName )
               cout << "file names should not match\n";
            else if( !decrypt( srcFileName, dstFileName, alphabets ) )
               cout << "failed.\n";
            else
               cout << "ok.\n";
        }
        else if( cmd == "help" )
        {
            cout << "generate  - generates a random alphabet\n"
                    "push      - pushes the last generated alphabet into\n"
                    "            the alphabet sequence\n"
                    "print     - prints current alphabet sequence\n"
                    "erase     - erases current alphabet sequence\n"
                    "load      - loads current alphabet sequence from a file\n"
                    "            appending it's contents to the current sequence\n"
                    "save      - saves current alphabet sequence to a file\n"
                    "encrypt   - encrypts a file with current alphabet sequence\n"
                    "decrypt   - decrypts a file with current alphabet sequence\n"
                    "help      - displays this message\n"
                    "quit      - terminates the program\n";
        }
 
    }
    while( cmd != "quit" );
 
    cout << "Goodbye.\n";
 
    return 0;
}
Генерирует шифроалфавиты, собирает наборы шифроалфавитов, сохраняет и загружает наборы из файлов, шифрует файлы наборами шифроалфавитов.
NinGAZ
14 / 14 / 1
Регистрация: 27.07.2011
Сообщений: 162
02.10.2011, 21:24     Шифр Альберти #3
http://articles.org.ru/cn/showdetail.php?cid=8341 тут есть про шифр. а вот как его реализовывать,уж сами думайте,мне кажется,что очень геморно,разве что по ASCII делать,хотя на самом деле достаточно интересно.)
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
02.10.2011, 22:48  [ТС]     Шифр Альберти #4
Цитата Сообщение от talis Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char ch;
 vector<string>::const_iterator alph_it = sequence.begin();
while( !ifs.eof() )
 {
 ch = ifs.get();
if( ch == EOF )
 break;
ofs.put( ( (*alph_it).find( ch ) == string::npos ) ? ch : (*alph_it)[ ch - ' ' ] );
alph_it++;
if( alph_it == sequence.end() )
 alph_it = sequence.begin();
 }
ifs.close();
 ofs.close();
return true;
}
Если не сложно ответить, то, что происходит в этих строках? Понимаю, что шифрование, но хотелось бы подробнее.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 23:08     Шифр Альберти #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
bool encrypt( const string &src_file_name, const string &dst_file_name, const vector<string> &sequence )
{
    ifstream ifs( src_file_name );
    ofstream ofs( dst_file_name );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
 
        return false;
    }
 
    char ch; // шифруемый символ
    vector<string>::const_iterator alph_it = sequence.begin(); // итератор шифроалфавита
 
    while( !ifs.eof() )
    {
        ch = ifs.get(); // читаем символ
 
        if( ch == EOF ) // если это - конец файла, то выходим
           break;
 
        // если этот символ принадлежит текущему шифроалфавиту,
        // то помещаем символ шифроалфавита, соответствующий текущему
        // иначе - помещаем текущий символ, не шифруя его
        ofs.put( ( (*alph_it).find( ch ) == string::npos ) ? ch : (*alph_it)[ ch - ' ' ] );
 
        // переключаемся на следующий шифроалфавит
        alph_it++;
 
        // если это был последний, то переключаемся на первый
        if( alph_it == sequence.end() )
           alph_it = sequence.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
03.10.2011, 12:22  [ТС]     Шифр Альберти #6
Как сделать алфавит замены,который формировался бы по ключевому слову и величине шага относительно сдвига?
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.10.2011, 12:24     Шифр Альберти #7
Цитата Сообщение от pro1004ok Посмотреть сообщение
Как сделать алфавит замены,который формировался бы по ключевому слову и величине шага относительно сдвига?
Как алфавит должен зависеть от ключевого слова? Что здесь означают "сдвиг" и "величина шага"?
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
03.10.2011, 18:11  [ТС]     Шифр Альберти #8
Цитата Сообщение от talis Посмотреть сообщение
Как алфавит должен зависеть от ключевого слова? Что здесь означают "сдвиг" и "величина шага"?
Ключом является алфавит замены, который формируется по ключевому слову и величене шага относительно сдвига.
Величина шага - фиксированное целочисленное значение.
Сдвиг - смещение алфавита замены относительно алфавита открытого текста. При этом алфавит замены не последовательный, а произвольный.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.10.2011, 19:16     Шифр Альберти #9
Цитата Сообщение от pro1004ok Посмотреть сообщение
алфавит замены, который формируется по ключевому слову и величене шага относительно сдвига.
Каким образом формируется? Вот есть ключевое слово: "Haskell_'90". Каким образом по нему формируется алфавит? Не по щучьему же велению.
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
04.10.2011, 00:16  [ТС]     Шифр Альберти #10
...При входном открытом тексте ПРИЕЗЖАЮ ШЕСТОГО и ключе шифрования АГАВААГАВААГАВАА алгоритм дает шифротекст ПНИГЗЖЮЮЮАЕОТМТО. Красным цветом выделены буквы, способ образования которых представлен на рисунке.
Название: 10.gif
Просмотров: 619

Размер: 2.3 Кб
http://www.compress.ru/article.aspx?id=10135&iid=420

P.S. Просто информации у меня мало дано по этой теме.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
04.10.2011, 01:10     Шифр Альберти #11
Кажется, начинаю понимать. Конкретная буква ключа определяет, насколько сдвигается алфавит. Интересно.

Добавлено через 48 минут
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
   шифрование одним алфавитом, но с ключом
*/
 
#include <iostream>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
/* сгенерировать случайный шифроалфавит */
string generate_alphabet()
{
    string alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
 
    // это несколько.. некрасиво
    /*for( char i = ' '; i <= '~'; i++ )
       alphabet.append( 1, i );*/
 
    random_shuffle( alphabet.begin(), alphabet.end() );
 
    return alphabet;
}
 
/* инкрементировать значения символов строки str value раз. */
string shift( const string &str, int value )
{
    string ret( str );
 
    for( size_t i = 0; i < value; i++ )
    {
        for( size_t u = 0; u < str.length(); u++ )
        {
            ret[u]++;
 
            if( ret[u] > '~' )
               ret[u] -= '~' - ' ';
        }
    }
 
    return ret;
}
 
bool encrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        ofs.put( new_alph[ ch - ' ' ] );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
bool decrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        pos = new_alph.find( ch );
        ofs.put( pos + ' ' );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
int main()
{
    string alphabet;
    string input;
 
    cout << "Key-guided single-alphabet Alberti cypher utility v 1.0\ntry help...\n";
 
    while( input != "quit" )
    {
        cout << "> ";
        cin >> input;
 
        if( input == "generate" )
        {
            alphabet = generate_alphabet();
            cout << alphabet << '\n';
        }
        else if( input == "load" )
        {
            string file;
 
            cout << "file > ";
            cin >> file;
 
            ifstream fs( file );
 
            if( !fs.is_open() )
                cout << "failed\n";
            else
            {
                getline( fs, alphabet );
                cout << alphabet << '\n';
                fs.close();
            }
        }
        else if( input == "save" )
        {
            string file;
 
            cout << "file > ";
            cin >> file;
 
            ofstream fs( file );
 
            if( !fs.is_open() )
                cout << "failed\n";
            else
            {
                fs << alphabet << '\n';
                cout << "ok\n";
                fs.close();
            }
        }
        else if( input == "encrypt" )
        {
            if( !alphabet.length() )
            {
                cout << "no alphabet\n";
                continue;
            }
 
            string srcfile, dstfile, key;
 
            cout << "src file > ";
            cin >> srcfile;
 
            cout << "dst file > ";
            cin >> dstfile;
 
            cout << "key > ";
            cin >> key;
 
            if( !encrypt( srcfile, dstfile, key, alphabet ) )
               cout << "failed\n";
            else
               cout << "ok\n";
        }
        else if( input == "decrypt" )
        {
            if( !alphabet.length() )
            {
                cout << "no alphabet\n";
                continue;
            }
 
            string srcfile, dstfile, key;
 
            cout << "src file > ";
            cin >> srcfile;
 
            cout << "dst file > ";
            cin >> dstfile;
 
            cout << "key > ";
            cin >> key;
 
            if( !decrypt( srcfile, dstfile, key, alphabet ) )
               cout << "failed\n";
            else
               cout << "ok\n";
        }
        else if( input == "help" )
        {
            cout << "generate    - generates a random alphabet\n"
                    "save        - save current alphabet into a file\n"
                    "load        - loads current alphabet from a file\n"
                    "encrypt     - encrypts a file with current alphabet\n"
                    "decrypt     - decrypts a file with current alphabet\n"
                    "help        - guess what\n"
                    "quit        - guess what\n";
        }
    }
 
    return 0;
}
Так как-то.
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
05.10.2011, 00:02  [ТС]     Шифр Альберти #12
Что-то ошибку выдаёт Debug Attention Failed. Может я что-то неверно делаю...
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
05.10.2011, 00:04     Шифр Альберти #13
pro1004ok, у меня всё работает. Вы уверены, что второе слово - Attention? Просто фраза, мне кажется, не имеет смысла: "Не удалось внимание отладки...". Может, attachment?
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
05.10.2011, 09:34  [ТС]     Шифр Альберти #14
Цитата Сообщение от talis Посмотреть сообщение
pro1004ok, у меня всё работает. Вы уверены, что второе слово - Attention? Просто фраза, мне кажется, не имеет смысла: "Не удалось внимание отладки...". Может, attachment?
Да, действительно не то написал. На самом деле: Debug Assertion Failed! Expression: String subscript out of range.
А что Вы в качестве ключа вводите?
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
05.10.2011, 14:28     Шифр Альберти #15
Цитата Сообщение от pro1004ok Посмотреть сообщение
А что Вы в качестве ключа вводите?
hello, 134Gfv, bionicman... разное. Судя по всему, у вас Visual Studio, и она пишет, что мы где-то вылезаем за пределы std::string. В mingw всё в порядке. Попробуйте запустить в Release и посмотреть, вылетит ли она с ошибкой. Просто я уже сто лет не работал в VS и не помню всех её особенностей.
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173
17.10.2011, 11:43  [ТС]     Шифр Альберти #16
Цитата Сообщение от talis Посмотреть сообщение
Кажется, начинаю понимать. Конкретная буква ключа определяет, насколько сдвигается алфавит. Интересно.

Добавлено через 48 минут
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
   шифрование одним алфавитом, но с ключом
*/
 
#include <iostream>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
/* сгенерировать случайный шифроалфавит */
string generate_alphabet()
{
    string alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
 
    // это несколько.. некрасиво
    /*for( char i = ' '; i <= '~'; i++ )
       alphabet.append( 1, i );*/
 
    random_shuffle( alphabet.begin(), alphabet.end() );
 
    return alphabet;
}
 
/* инкрементировать значения символов строки str value раз. */
string shift( const string &str, int value )
{
    string ret( str );
 
    for( size_t i = 0; i < value; i++ )
    {
        for( size_t u = 0; u < str.length(); u++ )
        {
            ret[u]++;
 
            if( ret[u] > '~' )
               ret[u] -= '~' - ' ';
        }
    }
 
    return ret;
}
 
bool encrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        ofs.put( new_alph[ ch - ' ' ] );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
bool decrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        pos = new_alph.find( ch );
        ofs.put( pos + ' ' );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
int main()
{
    string alphabet;
    string input;
 
    cout << "Key-guided single-alphabet Alberti cypher utility v 1.0\ntry help...\n";
 
    while( input != "quit" )
    {
        cout << "> ";
        cin >> input;
 
        if( input == "generate" )
        {
            alphabet = generate_alphabet();
            cout << alphabet << '\n';
        }
        else if( input == "load" )
        {
            string file;
 
            cout << "file > ";
            cin >> file;
 
            ifstream fs( file );
 
            if( !fs.is_open() )
                cout << "failed\n";
            else
            {
                getline( fs, alphabet );
                cout << alphabet << '\n';
                fs.close();
            }
        }
        else if( input == "save" )
        {
            string file;
 
            cout << "file > ";
            cin >> file;
 
            ofstream fs( file );
 
            if( !fs.is_open() )
                cout << "failed\n";
            else
            {
                fs << alphabet << '\n';
                cout << "ok\n";
                fs.close();
            }
        }
        else if( input == "encrypt" )
        {
            if( !alphabet.length() )
            {
                cout << "no alphabet\n";
                continue;
            }
 
            string srcfile, dstfile, key;
 
            cout << "src file > ";
            cin >> srcfile;
 
            cout << "dst file > ";
            cin >> dstfile;
 
            cout << "key > ";
            cin >> key;
 
            if( !encrypt( srcfile, dstfile, key, alphabet ) )
               cout << "failed\n";
            else
               cout << "ok\n";
        }
        else if( input == "decrypt" )
        {
            if( !alphabet.length() )
            {
                cout << "no alphabet\n";
                continue;
            }
 
            string srcfile, dstfile, key;
 
            cout << "src file > ";
            cin >> srcfile;
 
            cout << "dst file > ";
            cin >> dstfile;
 
            cout << "key > ";
            cin >> key;
 
            if( !decrypt( srcfile, dstfile, key, alphabet ) )
               cout << "failed\n";
            else
               cout << "ok\n";
        }
        else if( input == "help" )
        {
            cout << "generate    - generates a random alphabet\n"
                    "save        - save current alphabet into a file\n"
                    "load        - loads current alphabet from a file\n"
                    "encrypt     - encrypts a file with current alphabet\n"
                    "decrypt     - decrypts a file with current alphabet\n"
                    "help        - guess what\n"
                    "quit        - guess what\n";
        }
    }
 
    return 0;
}
Так как-то.
Всё таки величину начального сдвига нужно задавать числом.

...Альберти предложил оригинальный шифр сложной замены, на основе двух концентрических кругов, по окружности которых записывались алфавиты открытого текста и шифртекста. При этом алфавит замены мог быть не последовательным «АБВГ… ЭЮЯ», а произвольным «АЭВЮГ…» и мог быть смещен на любое число позиций.
В шифре Альберти была впервые реализована идея увеличения стойкости шифровальной системы путем повторения шифрования с помощью разных алфавитов (меняя последовательность алфавита замены и его сдвиг относительно алфавита открытого текста).
Шифрование по методу Альберти может быть реализовано в различных вариантах. Ключом в них, как правило, является порядок букв в алфавите замены, число позиций начального сдвига алфавитов
и величина шага при относительных сдвигах алфавитов после шифрования каждого символа или слова.
Миниатюры
Шифр Альберти  
|| Flashka ||
2 / 2 / 0
Регистрация: 03.03.2010
Сообщений: 94
24.11.2011, 14:19     Шифр Альберти #17
Цитата Сообщение от talis Посмотреть сообщение
ifstream ifs( src_file_name );
ofstream ofs( dst_file_name );
Подскажите в чем проблема...)))
Ругается на эти строки((

Ошибка 1 error C2664: std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const char *,std::ios_base::openmode,int): невозможно преобразовать параметр 1 из 'const std::string' в 'const char *' c:\documents and settings\санек\мои документы\visual studio 2008\projects\al\al\al.cpp 33
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
24.11.2011, 19:57     Шифр Альберти #18
|| Flashka ||, для преобразования std::string в const char используйте std::string::c_str.
|| Flashka ||
2 / 2 / 0
Регистрация: 03.03.2010
Сообщений: 94
25.11.2011, 15:43     Шифр Альберти #19
Я ничего не поняла..(( скажите куда и что именно написать))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 19:47     Шифр Альберти
Еще ссылки по теме:

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

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

Шифр Вижинера С++ - C++
Доброго времени суток помогите реализовать шифр Вижинера на с++(файлы скину).Необходимо сделать после шифровки методом Гаусса шифровку...

Шифр Гронсфельда - C++
Такой вопрос. Почему функция Gronsfeld всегда возвращает значение 0 (&quot;\0&quot;)? Может где ошибка, я не могу понять где? Помогите, кто может ...

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


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

Или воспользуйтесь поиском по форуму:
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.11.2011, 19:47     Шифр Альберти #20
|| Flashka ||, мой код у меня работает, и я понятия не имею, что вы с ним сделали. Показали бы хоть. А то - "сделай так, шоб работало", и сиди тут, гадай, как. Абракадабра! "sudo rm -rf /"!

Если серьёзно - читайте книжки.
Yandex
Объявления
25.11.2011, 19:47     Шифр Альберти
Ответ Создать тему
Опции темы

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