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

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

Войти
Регистрация
Восстановить пароль
 
goldenflor
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
#1

шифрование квадратом Виженера текста, состоящего из нескольких строчек - C++

19.11.2013, 18:46. Просмотров 678. Ответов 0
Метки нет (Все метки)

помогите найти ошибку:
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
 
int main (void) {
    FILE *fid;
    setlocale(LC_ALL, "rus");// для поддержки шрифтов кириллицы
/*
1.
В качестве специального алфавита примите только необходимые символы, имеющиеся в шифруемом сообщении.
*/
    char abc[] = "abcdefghijklmnopqrstuvwxyz .";
/*
Фраза для шифрования п. 4-5
*/
   char *str[] = {{"methods and means"},
         {"of protecting computer information."},
         {"encryption using table vizhenera."}};
     char secret[] = "december";// Лозунг - ключевое слово
 
 
/*
квадрат Виженера  
*/
     char *square[]={
         {"abcdefghijklmnopqrstuvwxyz "},
         {"bcdefghijklmnopqrstuvwxyz a"},
         {"cdefghijklmnopqrstuvwxyz ab"},
         {"defghijklmnopqrstuvwxyz abc"},
         {"efghijklmnopqrstuvwxyz abcd"},
         {"fghijklmnopqrstuvwxyz abcde"},
         {"ghijklmnopqrstuvwxyz abcdef"},
         {"hijklmnopqrstuvwxyz abcdefg"},
         {"ijklmnopqrstuvwxyz abcdefgh"},
         {"jklmnopqrstuvwxyz abcdefghi"},
         {"klmnopqrstuvwxyz abcdefghij"},
         {"lmnopqrstuvwxyz abcdefghijk"},
         {"mnopqrstuvwxyz abcdefghijkl"},
         {"nopqrstuvwxyz abcdefghijklm"},
         {"opqrstuvwxyz abcdefghijklmn"},
         {"pqrstuvwxyz abcdefghijklmno"},
         {"qrstuvwxyz abcdefghijklmnop"},
         {"rstuvwxyz abcdefghijklmnopq"},
         {"stuvwxyz abcdefghijklmnopqr"},
         {"tuvwxyz abcdefghijklmnopqrs"},
         {"uvwxyz abcdefghijklmnopqrst"},
         {"vwxyz abcdefghijklmnopqrstu"},
         {"wxyz abcdefghijklmnopqrstuv"},
         {"xyz abcdefghijklmnopqrstuvw"},
         {"yz abcdefghijklmnopqrstuvwx"},
         {"z abcdefghijklmnopqrstuvwxy"},
         {" abcdefghijklmnopqrstuvwxyz"},
     };
    
     char *crypto, // для шифрованного текста
         *decrypto; // для дешифрованного текста
 
     int i, j,j1, n,
         k,N, // в качестве переменного ключа (сдвига)
         m = strlen(secret); // количество символов лозунга
  
     // Количество символов заданного текста (фразы)
     int Nt1 = sizeof(str)/ sizeof(str[0]); 
           N = (int)strlen(abc);
     int *Na, // для цифрового кодирования исходного текста
         *Ns, // для цифрового кодирования лозунга
         *Nd, //для цифрового кодирования шифрованного текста
         *Nd1,
         *Nd2,
         *code=NULL,//для цифрового кодирования алфавита
         **code1=NULL;//для цифрового кодирования квадрата
    
 
       // Определение количества строк заданного текста
    int Nt = sizeof(square)/ sizeof(square[0]); 
 
     // Определение максимальной длины строки заданного текста
    int Mt = (int)strlen(square[0]); // предполагаемый максимум
     for ( int i = 1; i < Nt; i++)
         if (Mt < (int)strlen(square[i]))
              Mt = (int)strlen(square[i]);
 
     // Выделение блоков памяти и запись их адресов в указатели
     crypto = (char *)malloc( (Mt + 1) * sizeof(char));
     decrypto = (char *)malloc( (Mt + 1) * sizeof(char));
     Na = (int *)malloc( N * sizeof(int));
     Nd = (int *)malloc( N * sizeof(int));
     Ns = (int *)malloc( m * sizeof(int));
     Nd1 = (int *)malloc( Nt * sizeof(int));
       Nd2 = (int *)malloc( Nt * sizeof(int));
     code = (int *)calloc (N , sizeof(int));
     code1 = (int **)calloc(Nt, sizeof(int *));
     for (i = 0; i < Nt; i++)
         code1[i] = (int *)calloc(Mt, sizeof(int));
 
 // Цифровое кодирование специального алфавита
     for (i = 0; i < N; i++)
         code[i] = i;
 
     // Цифровое кодирование исходного текста
     for (i = 0; i < Nt; i++){
         for (j = 0; j < (int)strlen(str[i]); j++ ){
              for (n = 0; n < N; n++){
                   if (str[i][j] == abc[n])
                       crypto[i][j] = code[n];};};};
 
     // Цифровое кодирование лозунга
     for (j = 0; j < m; j++){
         for (i = 0; i < N; i++){
              if ( abc[i] == secret[j] )
                  Ns[j] = i;};};
 // Цифровое кодирование квадрата
     for (i = 0; i < Nt; i++)
         for (j = 0; j < (int)strlen(square[i]); j++ )
              for (n = 0; n < N; n++)
                   if (square[i][j] == abc[n])
                        code1[i][j] = code[n];
 
     puts(" Исходный текст:\n");
     for (i = 0; i < Nt; i++){         
             printf("%s\n",str[i]);}
 
/*
6.
Выведите квадрат Виженера в текстовый файл с именем compX.txt
(Х – номер компьютера)
*/
     printf("\n Лозунг: %s\n", secret);
          if ( (fopen_s(&fid, "comp7.txt", "wt")) != 0 )
     {
         printf("\n Файл не может быть открыт для записи\n");
         printf(" Нажмите любую клавишу для выхода: ");
         _getch();
         return -1;
     }
 puts("\n Квадрат :");
     for (i = 0; i < Nt; i++){
          puts("\n");
          fprintf(fid, "\n");
         for (j = 0; j < (int)strlen(square[i]); j++ ){
             printf("%c ", square[i][j]);
              fprintf(fid, "%c", square[i][j]);
        };};
        
     fclose (fid);
     puts("\n Квадрат Виженера в текстовом файле comp7.txt \n ");
 
     // Шифрование по методу Виженера
     j = 0;
     i=0;
     while (i < m) {
          for (j1 = 0; j1 < Nt; j1++){
              if (code1 [j1][0]==Ns[i]){
                  Nd[j]=code1 [j1][Na[j]];
              };};
          i++;
              
              if (i==m) 
              {i=0;};
              if (j==(Nt1-1))
              { break;};
              j++;
     };
     puts("\n Код шифрованного текста:");
     for (i = 0; i < Nt1; i++)
         printf(" %i ", Nd[i]);
 
 // Цифровое кодирование исходного текста-обратное
     for (j = 0; j < Nt1; j++){
         for (i = 0; i < N; i++){//алфавит
              if ( code[i] == Nd[j] )
                  crypto[j] = abc[i];
        };};
     puts("\n Шифрованный текст :");
     for (j = 0; j < Nt1; j++)
      printf(" %c ", crypto[j]);
 
    // Дешифрование по методу Виженера
    j = 0;
     i=0;
     while (i < m) {
          for (j1 = 0; j1 < Nt; j1++){
              if (code1 [j1][0]==Ns[i]){
                   for (int i1 = 0; i1 < (int)strlen(square[j1]); i1++ ){
                       if (code1 [j1][i1]==Nd[j])
                           Nd2[j]=code[i1];}
              };};
          i++;
              
              if (i==m) 
              {i=0;};
              if (j==(Nt1-1))
              { break;};
              j++;
     };
 
     //Цифровое кодирование исходного текста-обратное
     for (j = 0; j < Nt1; j++){
         for (i = 0; i < N; i++){//алфавит
              if ( code[i] == Nd2[j] )
                  decrypto[j] = abc[i];
        };};
      
 
 //Цифровое кодирование исходного текста-обратное
     for (j = 0; j < Nt1; j++){
         for (i = 0; i < N; i++){//алфавит
              if ( code[i] == Nd2[j] )
                  decrypto[j] = abc[i];
        };};
     puts("\n Расшифрованный текст:");
     for (j = 0; j < Nt1; j++)
      printf("%c", decrypto[j]);
     free(Na); free(Ns); free(Nd);
 
     printf("\n\n ... Нажмите любую клавишу: ");
     _getch();
     return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 18:46     шифрование квадратом Виженера текста, состоящего из нескольких строчек
Посмотрите здесь:

Шифрование текста алгоритмом Виженера не работает с кириллицей - C++
Код должен шифровать текст алгоритмом Виженера. Но не работает, на латинице работал, когда начал переводить на кирилицу текст после...

Шифрование шифра Виженера - C++
Здравствуйте! При шифровании сообщения на русском языке шифром Виженера у меня возникла ошибка. ind2=abc.find(key); &lt;--- вот в этой...

Шифрование Виженера, объясните программу - C++
#define _CRT_SECURE_NO_DEPRECATE #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; using namespace std; int...

Шифрование методов Виженера ДЛЯ РУССКИХ БУКВ - C++
Ребят, спасайте) Может остались у кого рабочие исходники данного шифра? Буду просто крайне признателен. Шифр по ниже представленной...

Шифрование квадратом Полибия - C++
Шифрование квадратом Полибия. Допустим, шифрую слово СЕЛДОН. Должно получиться зашифрованное сообщение 35 16 25 15 32 31, но выдает 15 16...

Найти мощность множества, состоящего из всех букв текста - C++
1.Найти мощность множества, состоящего из всех букв текста.

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

Шифрование текста - C++
Здравствуйте, пытаюсь зашифровать слово, через ключ. #include &lt;iostream&gt; using namespace std; int main() { char str =...

Курсовая: шифрование текста. - C++
Здравствуйте. В связи с рядом причин(главная конечно лень xD ), свою курсовую я умудрился взять только сейчас. Сдача через 2 недели....

Шифрование текста. XOR - C++
Помогите с шифрование текста...с числоми вроде получалось. Что значит эта ошибка и как ее испрвить?..) #include &lt;iostream&gt; #include...

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

Задача на шифрование текста, язык Cи. - C++
Произвести шифрование текста согласно вводимому ключу , который представляет из себя последовательность символов ( изначально 1,2,3,4,5,6...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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