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

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

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

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

19.11.2013, 18:46. Просмотров 711. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 18:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шифрование квадратом Виженера текста, состоящего из нескольких строчек (C++):

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

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

Шифрование Методом Виженера На C++ - C++
Здравствуйте. Мне нужна программа на тему Шифрование методом виженера. Я пытался найти в интернете варианты шифрования нашел только вот...

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

Шифрование Виженера, объясните программу - 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++
Ребят, спасайте) Может остались у кого рабочие исходники данного шифра? Буду просто крайне признателен. Шифр по ниже представленной...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 18:46
Привет! Вот еще темы с ответами:

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

Шифрование биграмм с двойным квадратом (C++) - C++
Всем добрый вечер! В общем надо зашифровать слово методом Биграмм с двойным квадратом. Суть их в чем заключается: 1)есть 2 таблицы...

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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