Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/160: Рейтинг темы: голосов - 160, средняя оценка - 4.73
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28

Взломать шифр Виженера методом частотного анализа

05.10.2015, 20:37. Показов 31859. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, сообщество. Возникла трудная задача, необходимо взломать шифр Виженера.
Основная проблема в том, что я не могу найти внятную информацию о том как это сделать и хотя бы один законченный пример. Я приведу пример своего кода, здесь я шифрую текст, расшифровываю его для проверки работы алгоритма шифрования, потом получаю длину ключевого слово методом Касиски, но дальше ничего. Может хоть кто-нибудь знает как это сделать?

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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Lab1IT
{
    public class Lab1Task1
    {
        public List<char> abc = new List<char>();
 
        public int GetIndex(char c)
        {
            for (int i = 0; i < abc.Count; i++) 
            {
                if (abc[i] == c)
                    return i;
            }
 
            return 0;
        }
 
        public int GetOffeset(char c)
        {
            return GetIndex (c) - GetIndex ('a');
        }
 
        public void InitABC()
        {
            for (int i = 97; i < 123; i++)
                abc.Add ((char)i);
//          for (int i = 1072; i < 1104; i++)
//              abc.Add ((char)i);
        }
 
        public void Encrypt (string file, string resultFile, string key)
        {
            string result = "";
            string message = System.IO.File.ReadAllText(file);
 
            key = PreapareKey (key, message);
 
            for (int i = 0; i < message.Length; i++) 
            {
                if (message [i] != ' ') 
                {
                    int index = GetIndex (message [i]);
                    int res = (index + GetIndex (key [i])) % abc.Count;
                    result += abc [res];
                }
                else
                result += ' ';
            }
 
            System.IO.File.WriteAllText (resultFile,result,System.Text.Encoding.UTF8);
            Console.WriteLine (result);
        }
 
        public void Decrypt (string file, string resultFile, string key)
        {
            string result = "";
            string message = System.IO.File.ReadAllText(file);
            
            key = PreapareKey (key, message);
 
            for (int i = 0; i < message.Length; i++) 
            {
                if (message [i] != ' ') 
                {
                    int index = GetIndex(message[i]);
                    int res = (index - GetIndex(key[i]) + abc.Count) % abc.Count;
                    result += abc[res];
                }
                else
                result += ' ';
            }
 
            System.IO.File.WriteAllText (resultFile,result,System.Text.Encoding.UTF8);
            Console.WriteLine (result);
        }
 
        public string PreapareKey(string key, string message)
        {
            string newKey = "";
            while (newKey.Length < message.Length) 
                newKey = newKey + key;
                
            if (newKey.Length < message.Length)
                newKey.Remove (message.Length);
 
            return newKey;
        }
 
        public Lab1Task1()
        {
            InitABC ();
        }
    }
 
 
    public class Lab1Task2 
    {
        public int lgramsLength = 3;
 
        public Dictionary <char,double> values = new Dictionary<char, double> ();
 
        public Lab1Task2()
        {
            values.Add ('a', 0.08167f);
            values.Add ('b', 0.01492f);
            values.Add ('c', 0.02782f);
            values.Add ('d', 0.04253f);
            values.Add ('e', 0.12702f);
            values.Add ('f', 0.02228f);
            values.Add ('g', 0.02015f);
            values.Add ('h', 0.06094f);
            values.Add ('i', 0.06966f);
            values.Add ('j', 0.00153f);
            values.Add ('k', 0.00772f);
            values.Add ('l', 0.04025f);
            values.Add ('m', 0.02406f);
            values.Add ('n', 0.06749f);
            values.Add ('o', 0.07507f);
            values.Add ('p', 0.01929f);
            values.Add ('q', 0.00095f);
            values.Add ('r', 0.05987f);
            values.Add ('s', 0.06327f);
            values.Add ('t', 0.09056f);
            values.Add ('u', 0.02758f);
            values.Add ('v', 0.00978f);
            values.Add ('w', 0.02360f);
            values.Add ('x', 0.00150f);
            values.Add ('y', 0.01974f);
            values.Add ('z', 0.00074f);
//          values.Add ('а', );
//          values.Add ('б', );
//          values.Add ('в', );
//          values.Add ('г', );
//          values.Add ('д', );
//          values.Add ('е', );
//          values.Add ('ж', );
//          values.Add ('з', );
//          values.Add ('и', );
//          values.Add ('к', );
//          values.Add ('л', );
//          values.Add ('м', );
//          values.Add ('н', );
//          values.Add ('о', );
//          values.Add ('п', );
//          values.Add ('р', );
//          values.Add ('с', );
//          values.Add ('т', );
//          values.Add ('у', );
//          values.Add ('ф', );
//          values.Add ('х', );
//          values.Add ('ц', );
//          values.Add ('ч', );
//          values.Add ('ш', );
//          values.Add ('щ', );
//          values.Add ('ъ', );
//          values.Add ('ы', );
//          values.Add ('ь', );
//          values.Add ('э', );
//          values.Add ('ю', );
//          values.Add ('я', );
        }
 
        int GCD(int a, int b)
        {
            return b == 0 ? a : GCD(b, a % b);
        }
 
        void GCD(List<int> repeatCount)
        {
            Dictionary<int,int> pairs = new Dictionary<int, int> ();
 
            Console.WriteLine (repeatCount.Count);
 
            for (int i = 0; i < repeatCount.Count; i++)
            {
                for (int j = i + 1; j < repeatCount.Count; j++) 
                {
                    int gc = GCD (repeatCount [i], repeatCount [j]);
 
                    if (gc > 1) 
                    {
                        if (pairs.ContainsKey (gc))
                            pairs [gc]++;
                        else
                            pairs.Add (gc, 1);
                    }
                }
            }
                
            var sortDict = pairs.OrderByDescending (x => x.Value).Take(5);
 
            foreach (var s in sortDict)
            {
                if(s.Value>0)
                {
                    Console.Write (s.Key + " ");
                }
            }
 
            Console.WriteLine ();
        }
 
        public void SearchLGrams(string file)
        {
            string message = System.IO.File.ReadAllText(file);
 
            List<int> repeats = new List<int>();
 
            for (int i = 0; i < message.Length - lgramsLength; i++) 
            {
                string lgram1 = message.Substring(i,lgramsLength);
 
                for (int j = i+1; j < message.Length - lgramsLength; j++) 
                {
                    string lgram2 = message.Substring(j,lgramsLength);
 
                    if (lgram1.Equals(lgram2))
                    {
                        repeats.Add (j - i);    
                    }
                }
            }
 
            GCD (repeats);
 
            string text = message.Replace(" ", string.Empty).ToLower();
            double symbolsCount = text.Length;
 
 
            SortedDictionary< char, int > dict = new SortedDictionary<char, int>();
 
            for (int i = 0; i < text.Length; i++)
                if (dict.ContainsKey(text[i]))
                    dict[text[i]]++;
                else
                    dict.Add(text[i], 1);
 
            var sortDict = dict.OrderByDescending(x => x.Value);
 
            Dictionary<char,double> resultedValues = new Dictionary<char, double> ();
 
            foreach (KeyValuePair< char, int > kvp in sortDict) 
            {
                double val = System.Math.Round((double)kvp.Value/symbolsCount,5);
                resultedValues.Add(kvp.Key,val);
                Console.WriteLine ("Символ: {0}, встречается {1} раз. Частота {2}. Дано {3}", kvp.Key,
                    kvp.Value,val,System.Math.Round((double)values[kvp.Key],5));
            }
                
        }
    }
 
 
    class MainClass
    {
        public static void Main (string[] args)
        {
            Lab1Task1 lab1Task1 = new Lab1Task1 ();
            lab1Task1.Encrypt ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/code.txt", "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt", "abcdefg");
            lab1Task1.Decrypt ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt", "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/decoded.txt", "abcdefg");
 
            Lab1Task2 lab1Task2 = new Lab1Task2 ();
            lab1Task2.SearchLGrams ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt");
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2015, 20:37
Ответы с готовыми решениями:

Шифр на основе частотного анализа
Доброго времени суток! Имеется вот такой шифр. Единственное, что известно - здесь нужно применить частотный анализ. ...

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

Расшифровать текст методом частотного анализа
Зашифровывание сообщений состоят в замене букв исходного текста в соответствии с некоторой (известной только отправителю и получателю)...

12
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
05.10.2015, 23:25
Цитата Сообщение от Nseries Посмотреть сообщение
как это сделать?
Вам в раздел Криптография.

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

На практике, для текста без разделителей и длине моноалфавитной цепочки менее 200 символов, перспективы туманные...

Жданов, Куденкова ! Криптоанализ классических шифров
Взлом шифра Виженера с помощью частотного криптоанализа
Генетический алгоритм для криптоанализа шифра Виженера
0
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28
06.10.2015, 00:28  [ТС]
Спасибо за попытку помочь, но я бы не писал сюда, если бы не не искал информацию до этого. Я не хочу изучать целую книгу ради одной лабы. Должен же быть у кого-то пример. Я не прошу за меня написать, просто дайте посмотреть как это реализуют. Только, пожалуйста, ссылку на реальный код.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
06.10.2015, 01:05
Кажется, вы не вполне представляете себе задачу.

Нет кода.

Есть эвристики, есть оптмизационные алгоритмы, есть статьи, в которых говорится о ~90% расшифровке (для английского языка). Остальное зависит от текста (прежде всего, от его размера), навыков криптоаналитика, удачно выбранной фитнесс-функции (отдельная проблема оптимизации), близости модельного текста к оригиналу и прочей магии.

Полный проект на C (для моноалфавитного шифра): Alkindus
Features
  • Flexible character n-gram language model builder
  • Simple Good-Turing (SGT) n-gram frequency estimator
  • Multi-threaded cryptogram solver based on genetic algorithm
  • Sukhotin's vowel identification algorithm
  • Uses glib-2.0 and gthread-2.0 C libraries for portability
1
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28
07.10.2015, 17:24  [ТС]
В общем пришлось все делать самому. Нормального кода нигде не нашел. Возможно смогу спасти несколько вечеров несчастным студентам. Вот мой пример. Для сдачи пойдет. Шифрование/Расшифрование Виженером, анализ Касиски, вскрытие пароля частотным анализом. Все автоматизировано. Для русского и английского. Смотрите чтобы в файле были только маленькие буквы и не было знаков препинания (по условию задачи только русские и английские маленькие буквы должны быть). Встречаются странные моменты, но все делал в последний момент лишь бы работало.
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
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Lab1IT
{
    public class Lab1Task1
    {
        public string language = "ru";
        public List<char> abc = new List<char>();
 
        public void Init(string language)
        {
            this.language = language;
            InitABC ();
            Console.WriteLine (language);
        }
 
        public int GetIndex(char c)
        {
            for (int i = 0; i < abc.Count; i++) 
            {
                if (abc[i] == c)
                    return i;
            }
 
            return 0;
        }
 
        public int GetOffeset(char c)
        {
            return GetIndex (c) - GetIndex (language.Equals("en") ? 'a' : 'а');
        }
 
        public void InitABC()
        {
            if (language.Equals("en"))
            {
                for (int i = 97; i < 123; i++)
                    abc.Add ((char)i);
            }
            else
            {
                for (int i = 1072; i < 1104; i++)
                    abc.Add ((char)i);
            }
        }
 
        public void Encrypt (string file, string resultFile, string key)
        {
            string result = "";
            string message = System.IO.File.ReadAllText(file);
 
            key = PreapareKey (key, message);
 
            for (int i = 0; i < message.Length; i++) 
            {
                if (message [i] != ' ') 
                {
                    int index = GetIndex (message [i]);
                    int res = (index + GetIndex (key [i])) % abc.Count;
                    result += abc [res];
                }
                else
                result += ' ';
            }
 
            System.IO.File.WriteAllText (resultFile,result,System.Text.Encoding.UTF8);
        }
 
        public void Decrypt (string file, string resultFile, string key)
        {
            string result = "";
            string message = System.IO.File.ReadAllText(file);
            
            key = PreapareKey (key, message);
 
            for (int i = 0; i < message.Length; i++) 
            {
                if (message [i] != ' ') 
                {
                    int index = GetIndex(message[i]);
                    int res = (index - GetIndex(key[i]) + abc.Count) % abc.Count;
                    result += abc[res];
                }
                else
                result += ' ';
            }
 
            System.IO.File.WriteAllText (resultFile,result,System.Text.Encoding.UTF8);
            Console.WriteLine (result);
        }
 
        public string PreapareKey(string key, string message)
        {
            string newKey = "";
            while (newKey.Length < message.Length) 
                newKey = newKey + key;
 
        
            for (int i = 0; i < message.Length; i++) 
            {
                    if (message [i] == ' ')
                        newKey = newKey.Insert (i, " ");
            }
            
 
            newKey = newKey.Remove (message.Length);
 
            return newKey;
        }
 
    }
 
 
    public class Lab1Task2 : Lab1Task1
    {
        public int lgramsLength = 3;
 
        int GCD(int a, int b)
        {
            return b == 0 ? a : GCD(b, a % b);
        }
 
        int GCD(List<int> repeatCount)
        {
            Dictionary<int,int> pairs = new Dictionary<int, int> ();
 
            Console.WriteLine (repeatCount.Count);
 
            for (int i = 0; i < repeatCount.Count; i++)
            {
                for (int j = i + 1; j < repeatCount.Count; j++) 
                {
                    int gc = GCD (repeatCount [i], repeatCount [j]);
 
                    if (gc > 1) 
                    {
                        if (!pairs.ContainsKey (gc)) 
                        {
                            pairs.Add (gc, 1);
                        } 
                        else 
                        {
                            pairs [gc]++;
                        }
                    }
                }
            }
                
            var sortDict = pairs.OrderByDescending (x => x.Value).Take(10);
 
            foreach (var s in sortDict)
            {
                if(s.Value>0)
                {
                    Console.Write (s.Key + "(" + s.Value + ") ");
                }
            }
 
            int len = 0;
 
            foreach (var s in sortDict)
            {
                if(s.Value>0)
                {
                    len = s.Key;
                    break;
                }
            }
 
 
            Console.WriteLine ();
            return len;
        }
 
        int CalculateGCDForL(string message, string lgram)
        {
            List<int> positions = new List<int> ();
 
            Console.WriteLine ();
            Console.WriteLine (lgram);
 
            for (int i = 0; i < message.Length - lgramsLength; i++) 
            {
                string lgram1 = message.Substring(i,lgramsLength);
 
                if (lgram1.Equals (lgram))
                    positions.Add (i);
            }
 
            foreach(int i in positions)
            {
                Console.Write (i + " ");
            }
 
            Console.WriteLine ();
 
            List<int> lengths = new List<int> ();
 
            for (int i = 0; i < positions.Count-1; i++) 
            {
                    int currentLength = positions [i+1] - positions [i];
                    lengths.Add (currentLength);
            }
 
            foreach(int i in lengths)
            {
                Console.Write (i + " ");
            }
 
            Console.WriteLine ();
 
            int currentGCD = lengths[0];
 
            for (int i = 1; i < lengths.Count; i++) 
            {
                currentGCD = GCD (currentGCD, lengths [i]);
            }
 
            return currentGCD = lengths[0];
        }
 
        public void SearchLGrams(string file)
        {
            string message = System.IO.File.ReadAllText(file);
 
            message = message.Replace (" ", "");
 
            List<int> repeats = new List<int> ();
 
            for (int i = 0; i < message.Length - lgramsLength; ++i) 
            {
                string lgram1 = message.Substring(i,lgramsLength);
            
                for (int j = i+1; j < message.Length - lgramsLength; ++j) 
                {
                    string lgram2 = message.Substring(j,lgramsLength);
            
                    if (lgram1.Equals(lgram2))
                    {
                        repeats.Add (j - i);    
                    }
                }
            }
 
            GCD (repeats);
 
            int keyLength = GCD (repeats);
            char [,] strings = new char[500000,keyLength];
 
            message = message.Replace (" ", "");
 
            for (int i = 0; i < message.Length; i++) 
            {
                int ii = i / keyLength;
                int ij = i - (ii * keyLength);
 
                strings [ii, ij] = message [i];
            }
 
            for (int i = 0; i < (message.Length / keyLength)+1; i++) 
            {
                for (int j = 0; j < keyLength; j++) 
                {
                    Console.Write (strings [i, j] + " ");
                }
                Console.WriteLine ();
            }
 
            string password = "";
 
            for (int i = 0; i < keyLength; i++) 
            {
                Dictionary<char,int> dict = new Dictionary<char,int>();
 
                for (int j = 0; j < (message.Length / keyLength)+1; j++)
                    if (dict.ContainsKey(strings[j,i]))
                        dict[strings[j,i]]++;
                    else
                        dict.Add(strings[j,i], 1);
 
                var sortict = dict.OrderByDescending(x => x.Value);
 
                char sy = language.Equals("en") ? 'e' : 'о';
                foreach (KeyValuePair<char, int > kvp in sortict) 
                {
                    sy = kvp.Key;
                    break;
                }
                    
                int res = (GetIndex(sy) - GetIndex(language.Equals("en") ? 'e' : 'о') + abc.Count) % abc.Count;
 
                password += abc [res];
 
            }
 
            Console.WriteLine(password);
            Decrypt ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt", 
                "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/decoded.txt", password); 
        }
    }
 
 
    class MainClass
    {
        public static void Main (string[] args)
        {
            string language = "ru";
 
            string key = "miami";
            string codePath = "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/code.txt";
 
            string message = System.IO.File.ReadAllText(codePath);
 
            foreach (char c in message) 
            {
                if ((int)c >= 97 && (int)c <= 123) 
                {
                    language = "en";
                    break;
                }
            }
                
            Lab1Task1 lab1Task1 = new Lab1Task1 ();
            lab1Task1.Init (language);
            lab1Task1.Encrypt (codePath, "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt", key);
            lab1Task1.Decrypt ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt", "/Users/Alexander/Projects/Lab1IT/Lab1IT/files/decoded.txt", key);
 
            Lab1Task2 lab1Task2 = new Lab1Task2 ();
            lab1Task2.Init (language);
            lab1Task2.SearchLGrams ("/Users/Alexander/Projects/Lab1IT/Lab1IT/files/encoded.txt");
 
        }
    }
}
code.txt
codeRus.txt
Передавайте Богушу Р.П. привет
10
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 5
11.11.2015, 18:43
приветикNseries, можно тебе вопросы задать по твоей программе??
0
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28
11.11.2015, 18:52  [ТС]
Да, конечно
1
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 5
11.11.2015, 19:20
Вообще я программирую на с++, а задача стоит расшифровать Виженер не зная ключа, вот, длину ключа я нашла и методом криптоанализа пыталась найти ключ, но все тщетно.. и тут я нашла твою программу. ближе к сути, я не поняла что в code писать, наверно сам шифротекст??

Добавлено через 17 минут
Nseries, а сколько по времени программа у тебя компилируется??
0
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28
11.11.2015, 20:20  [ТС]
LitteAlice, в файле code у меня расшифрованный текст. Тот файл, который я подаю на шифирование.
Программа компилируется моментально, а выполняется секунд 10. Поиск длины занимает прилично времени.

Ключ подбирается со строчки
C#
1
char [,] strings = new char[500000,keyLength];
Объявляется двумерный массив, в который будет находится наш зашифрованный текст.
Поясню для чего. Допустим, наш текст: "ыфсыфс фы фывфы вмваи ави вмв" и мы определили что длина ключа 5, то нужно представить текст в таком виде:

ыфсыф
сфыфы
вфывм
ваиав
ивмв

Для этого я избавился от всех пробелов
C#
1
 message = message.Replace (" ", "");
и записал шифротекст в массив.
C#
1
2
3
4
5
6
7
for (int i = 0; i < message.Length; i++) 
            {
                int ii = i / keyLength;
                int ij = i - (ii * keyLength);
 
                strings [ii, ij] = message [i];
            }
В этом массиве столбцов столько, сколько длина ключа.
Дальше я прохожусь по каждому столбцу и нахожу в нем самую популярную букву
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
for (int i = 0; i < keyLength; i++) 
            {
                Dictionary<char,int> dict = new Dictionary<char,int>();
 
                for (int j = 0; j < (message.Length / keyLength)+1; j++)
                    if (dict.ContainsKey(strings[j,i]))
                        dict[strings[j,i]]++;
                    else
                        dict.Add(strings[j,i], 1);
 
                var sortict = dict.OrderByDescending(x => x.Value);
 
                char sy = language.Equals("en") ? 'e' : 'о';
                foreach (KeyValuePair<char, int > kvp in sortict) 
                {
                    sy = kvp.Key;
                    break;
                }
                    
                int res = (GetIndex(sy) - GetIndex(language.Equals("en") ? 'e' : 'о') + abc.Count) % abc.Count;
 
                password += abc [res];
 
            }
dict это словарь, в котором хранится буква и сколько раз она встретилась.
C#
1
2
3
4
5
        for (int j = 0; j < (message.Length / keyLength)+1; j++)
                    if (dict.ContainsKey(strings[j,i]))
                        dict[strings[j,i]]++;
                    else
                        dict.Add(strings[j,i], 1);
Вот тут я и считаю сколько раз в столбце встретилась анализируемая буква.
Дальше я сортирую свой словарь и выбираю первый, т.е. самый популярный символ.
Нахожу разницу между найденной буквой и самой популярной буквой в вашем алфавите. Тут нужно просто смириться. Для английского языка это e, для русского о. Вот и считайте на сколько сдвинули вашу самую популярную букву от буквы о или e. Это расстояние и есть буква вашего ключа. Так находится весь пароль. Но имейте ввиду, чем меньше текст, тем меньше вероятность найти длину пароля. Чем длиннее пароль, тем меньше вероятность найти его. И текст должен быть равномерный, а не одна строчка размноженная 10 раз.
3
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 5
11.11.2015, 20:30
Nseries, то есть получается мы записываем в массив зашифрованный текст? а длина текста у меня 1990 символов без пробелов и знаков
1
 Аватар для Nseries
20 / 20 / 2
Регистрация: 02.02.2013
Сообщений: 28
11.11.2015, 20:39  [ТС]
LitteAlice, да, допустим если у вас пароль 5 символов, то получится массив у которого 1900/5 = 380 строк и 5 столбцов.
1
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 5
11.11.2015, 21:43
Nseries, в общем я разделила текст на 398 строк и 5 столбцов и не расшифровал, получилось вот так: "сочвоооихтесоотитигооомчлооожиси"
0
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 5
12.11.2015, 08:04
Nseries, спасибо тебе большое, что помогаешь я зашифрованный текст добавила... смогла найти только длину ключа равную 5, методом Казиского, уже больше месяца с этим сижу медленно схожу с ума
Вложения
Тип файла: txt encoded.txt (4.7 Кб, 390 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2015, 08:04
Помогаю со студенческими работами здесь

Расшифровка шифротекста методом частотного анализа
Помогите! Нужно расшифровать методом частотного анализа криптограмму. Знаю только то, что зашифрованы только буквы (без пробелов, чисел...

Расшифровка текста методом частотного анализа
Здраствуйте помогите расшифровать! с помошью частотного анализа!! Эояё зб эф рныйзб цф Тшошэлуэй-Сйюшжй, ъйьшнэйыышюш куоуэшёмбтй...

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

Расшифровка шифротекста методом частотного анализа
Доброго времени суток Помогите, кто может уже сколько времени потратил , всё не получается Задание: есть исходный шифротекст -...

Криптография - расшифровать текст методом частотного анализа
Нужно расшифровать текст методом частотного анализа - Тчхсфяц рънпсэчи, сн хснспсьс охпдфч чончттмб рпчичтм ымвфч, няхщъ эъыён оъюа ояуду...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru