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

Частотный анализ. Криптоанализ шифра замены. С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 75, средняя оценка - 4.92
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
04.11.2010, 21:00     Частотный анализ. Криптоанализ шифра замены. С++ #1
Доброго времени суток. Задача состоит в следующем:
"Дан зашифрованный файл, методом замены. Ключа и открытого текста нет. Надо дешифровать"
Реализовать это придётся через частотный анализ текста, где необходимо подсчитать:
Сколько раз, встречается каждый символ в тексте
Поиск по форумам выдал темы с предложением людей - использовать 256 символьный массив. Препод сказал, что это тоже наилучший вариант. Но вот сколько не пытался вникнуть, так и не понял, как это должно работать.
?- То ли сначала объявлять массив, и по каждому элементу проходить содержимым файла, или по каждому символу файла пропускать массив...
?- Массив должен быть одномерный или двумерный?
Вообщем чем дальше в лес тем больше дров. Помогите с этим участком кода и пояснениями к нему. Как всё таки организовать этот частотный анализ?

З.Ы. язык знаю очень плохо. Только на уровне написания программ для расчета площади треугольника =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2010, 21:00     Частотный анализ. Криптоанализ шифра замены. С++
Посмотрите здесь:

частотный анализ строки C++
Частотный анализ текста (символьный) C++
Криптоанализ шифра Цезаря C++
C++ Криптоанализ шифротекста, полученного методом простой замены
C++ Частотный анализ текста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
04.11.2010, 21:11     Частотный анализ. Криптоанализ шифра замены. С++ #2
выводит частоту каждого символа файла 1.txt в процентах
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
#include <iostream>
#include <fstream>
#include <iomanip>
 
 
int main()
{
    const int start=32;
    const int size=128;
    char ch;
    int mas[size]={};
 
    std::ifstream in("1.txt", std::ios::out | std::ios::binary);
 
    if (!in){
        std::cout<<"error open file";
        return EXIT_FAILURE;
    }
 
    while (in.get(ch))
    ++mas[(int)ch];
 
    //count symbols
    int cnt_char=0;
    for (int i = start; i < size; ++i)
    cnt_char+=mas[i];
 
    //table
    std::cout<<"__ Frequency of characters in the percentage __"<<std::endl<<std::endl;
    for (int i = start; i < size; ++i){
        if ( mas[i] )
        std::cout<<(char)i<<" --> "<<(float)(mas[i]*100)/(float)cnt_char<<"%"<<std::endl;
    }
 
    
    return EXIT_SUCCESS;
}


start можеш сделать 0 а end 256 тогда и будет 256-и символьный масиив
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
04.11.2010, 21:16  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #3
PointsEqual
Спасибо за текст. Я уже его видел, смотрел, но к сожалению ничего не понял.
std::ifstream in("1.txt", std::ios::out | std::ios::binary)
вот такие вещи для меня вообще не понятны
Если сможешь переписать в приблизительно таком синтаксисе: fopen scanf printf с русским описанием буду премного благодарен!
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
04.11.2010, 21:23     Частотный анализ. Криптоанализ шифра замены. С++ #4
Цитата Сообщение от chesar Посмотреть сообщение
вот такие вещи для меня вообще не понятны
ios::out значит потоксоздается для вывода
ios::binary значит бинарный режим

Добавлено через 23 секунды
Цитата Сообщение от chesar Посмотреть сообщение
Если сможешь переписать в приблизительно таком синтаксисе: fopen scanf printf с русским описанием буду премного благодарен!
на C не смогу
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
04.11.2010, 21:30  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
на C не смогу
А хотя бы заменить операторы, условия и т.д. русскими словами =) оставить только переменные =)
Zilon
5 / 5 / 0
Регистрация: 05.11.2010
Сообщений: 60
05.11.2010, 05:30     Частотный анализ. Криптоанализ шифра замены. С++ #6
Ключевые места:
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
    while (in.get(ch))
    ++mas[(int)ch];
Пока входной поток не пуст берем следующий символ и ложем его в ch
Далее индексируемся его значением по массиву частот (Почитай про цифровую сортировку)


Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
     for (int i = start; i < size; ++i)
    cnt_char+=mas[i];
Определяем сколько всего входных значений


Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
3
    for (int i = start; i < size; ++i){
        if ( mas[i] )
        std::cout<<(char)i<<" --> "<<(float)(mas[i]*100)/(float)cnt_char<<"%"<<std::endl;
Выводим на экран частоты
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
27.11.2010, 01:57  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #7
Получилось два массива. Индексы элементов это символы, а значения отображают встречаемость. Сортировать, я так понимаю, низя. Как быть? Может находить максимальный элемент, записывать его индекс в другой массив, и обнулять?
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
28.11.2010, 14:57  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #8
Что-то накалякал. Но в файл не пишется. Тыкните в ошибку:
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
//---------------------------------------------------------------------------
#include <stdlib.h>
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#pragma argsused
 
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//---------------------------------------------------------------------------
//Часть 1. Получаем встречаемость для каждого символа.
int b[256], j, c, c2;
 
 FILE *f;   //Это файл исходника
   if ((f=fopen("D:\\nw\\f.txt", "r"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 FILE *Crypt;
   if ((Crypt=fopen("D:\\nw\\Crypt.txt", "r"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 
 FILE *f2;
   if ((f2=fopen("D:\\nw\\f2.txt", "w"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 FILE *f3;
   if ((f3=fopen("D:\\nw\\f3.txt", "w"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
for (j=0; j<256; j++) b[j]=0;
 
while ((c=fgetc(f))!=EOF) b[с ]++;
 
//for (j=0; j<256; j++) fprintf(f2,"%c----------%d \n",j,b[j]);
//------------------------------------------------------------------
int crypt[256];
c=0;
for (j=0; j<256; j++) crypt[j]=0;
 
while ((c=fgetc(Crypt))!=EOF) crypt[с ]++;
 
//------------------------------------------------------------------------
//Часть 2. Упорядочиваем статистику по убыванию.
 
int max,i, ind, sorticx[256];
 
for (j=0; j<256; j++)
    {sorticx[j]=0; max=0;
    for (i=0; i<256; i++)
         { if (b[i]>max)
               {max=b[i]; ind=i;}
          }
     sorticx[j]=ind; b[ind]=0;
 
     }
//---------------------------------------------------------------
int sortcrypt[256];
for (j=0; j<256; j++)
    {sortcrypt[j]=0; max=0;
    for (i=0; i<256; i++)
         { if (crypt[i]>max)
               {max=b[i]; ind=i;}
          }
     sortcrypt[j]=ind; crypt[ind]=0;
          }
//--------------------------------------------------------------------------
//Часть 3. Дешифрование.
int s, c3;
c=0;
while ((c=fgetc(Crypt))!=EOF)
  { for (i=0; i<256; i++)
    { if (sortcrypt[i]=c) s=sorticx[i];
    }
    fprintf (f3,"%c",s);
  }
 
 
 
 
fclose(f);  fclose(f2);  fclose(f3); fclose(Crypt);
printf("OK");
 
getch(); getch();
        return 0;
}
//---------------------------------------------------------------------------
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
29.11.2010, 22:22  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #9
Нашел несколько косяков. Но теперь такая проблема. Запись в файл происходит, и файл получается такого же размера, как зашифрованный, но бинарный! Как быть?
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
//---------------------------------------------------------------------------
#include <stdlib.h>
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#pragma argsused
 
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//---------------------------------------------------------------------------
//Часть 1. Получаем встречаемость для каждого символа.
int stmas[256], j, c;
 
 FILE *f;   //Это файл исходника
   if ((f=fopen("D:\\nw\\f.txt", "r"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 FILE *Cryptofile;
   if ((Cryptofile=fopen("D:\\nw\\Crypt.txt", "r"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 
 FILE *f2;
   if ((f2=fopen("D:\\nw\\f2.txt", "w"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
 FILE *f3;
   if ((f3=fopen("D:\\nw\\f3.txt", "w"))==NULL)
   {ShowMessage("FILE NOT FOUND!"); return 0; }
 
for (j=0; j<256; j++) stmas[j]=0;
 
while ((c=fgetc(f))!=EOF) stmas[c]++;
 
//------------------------------------------------------------------
int cmas[256];
c=0;
for (j=0; j<256; j++) cmas[j]=0;
 
while ((c=fgetc(Cryptofile))!=EOF) cmas[c]++;
fclose(Cryptofile);
 
//------------------------------------------------------------------------
//Часть 2. Упорядочиваем статистику по убыванию.
 
int max,i, ind, sorticx[256];
 
for (j=0; j<256; j++)
    {sorticx[j]=0; max=0; ind=0;
    for (i=0; i<256; i++)
         { if (stmas[i]>max)
               {max=stmas[i]; ind=i;}
          }
     sorticx[j]=ind; stmas[ind]=0;
 
     }
//---------------------------------------------------------------
int sortcrypt[256];
for (j=0; j<256; j++)
    {sortcrypt[j]=0; max=0; ind=0;
    for (i=0; i<256; i++)
         { if (cmas[i]>max)
               {max=cmas[i]; ind=i;}
          }
     sortcrypt[j]=ind; cmas[ind]=0;
          }
//--------------------------------------------------------------------------
//Часть 3. Дешифрование.
int s;  Cryptofile=fopen("D:\\nw\\crypt.txt","r");
c=0;
while ((c=fgetc(Cryptofile))!=EOF)
  { for (i=0; i<256; i++)
    { if (sortcrypt[i]=c) s=sorticx[i];
    }
    fprintf (f3,"%c",s);
  }
 
 
 
 
fclose(f);  fclose(f2);  fclose(f3); fclose(Cryptofile);
printf("OK");
 
getch(); getch();
        return 0;
}
//---------------------------------------------------------------------------
Добавлено через 2 часа 43 минуты
Народ. Ну обратите внимание! Уделите пару минут! Ни есть, ни пить, ни спать не могу )))))
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
29.11.2010, 22:50     Частотный анализ. Криптоанализ шифра замены. С++ #10
chesar, Напишите мне в личку, вместе подумаем. У меня очень много уточняющих вопросов по этой теме.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2010, 23:00     Частотный анализ. Криптоанализ шифра замены. С++ #11
Цитата Сообщение от chesar Посмотреть сообщение
Если сможешь переписать в приблизительно таком синтаксисе: fopen scanf printf с русским описанием буду премного благодарен!
переписал:
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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE    128
#define START   32
 
int main()
{
        int i = 0;
 
        char ch = 0;
        int cnt = 0;
        int mas[SIZE] = { 0 };
 
        FILE *pfile = NULL;
 
        if((pfile = fopen("1.txt", "rb")) == NULL) {
                fprintf(stderr, "can't open file\n");
                return EXIT_FAILURE;
        }
 
        while((ch = getc(pfile)) != EOF)
                ++mas[(int)ch];
 
        for(i = START; i < SIZE; ++i) 
                cnt += mas[i];
 
        printf("Frequence of characters in the percentage\n");
        for(i = START; i < SIZE; ++i) {
                if(mas[i]) {
                        printf("%c: %f%\n", (char)i, (float)(mas[i]*100)/cnt);
                }
        }
 
        fclose(pfile);
        return EXIT_SUCCESS;
}
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
30.11.2010, 12:40  [ТС]     Частотный анализ. Криптоанализ шифра замены. С++ #12
valeriikozlov написал

Добавлено через 37 секунд
fasked, спасибо. С этим пунктом уже разобрался. Теперь другие проблемы...
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
21.01.2011, 02:04     Частотный анализ. Криптоанализ шифра замены. С++ #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
#include <iostream>
#include <fstream>
#include <iomanip>
 
 
int main()
{
    const int start=32;
    const int size=128;
    char ch;
    int mas[size]={};
 
    std::ifstream in("1.txt", std::ios::out | std::ios::binary);
 
    if (!in){
        std::cout<<"error open file";
        return EXIT_FAILURE;
    }
 
    while (in.get(ch))
    ++mas[(int)ch];
 
    //count symbols
    int cnt_char=0;
    for (int i = start; i < size; ++i)
    cnt_char+=mas[i];
 
    //table
    std::cout<<"__ Frequency of characters in the percentage __"<<std::endl<<std::endl;
    for (int i = start; i < size; ++i){
        if ( mas[i] )
        std::cout<<(char)i<<" --> "<<(float)(mas[i]*100)/(float)cnt_char<<"%"<<std::endl;
    }
 
    
    return EXIT_SUCCESS;
}
программа нормальная, но может кто-то помочь дописать так чтобы она текст разшифровывала без ключа. То есть чтобы сравнивала с уже готовыми таблицами частот встречания букв в тексте, и заменяла букву что нашла в тексте на ту с которой ближе всего процент частоты с таблицы
Tutarin
1 / 1 / 0
Регистрация: 21.10.2010
Сообщений: 10
26.01.2011, 00:16     Частотный анализ. Криптоанализ шифра замены. С++ #14
Помогите кто нибудь, пожалуйста!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 21:47     Частотный анализ. Криптоанализ шифра замены. С++
Еще ссылки по теме:

C++ Частотный анализ байтов файла
Частотный анализ текста C++
C++ Частотный анализ

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

Или воспользуйтесь поиском по форуму:
Style_
Сообщений: n/a
28.09.2013, 21:47     Частотный анализ. Криптоанализ шифра замены. С++ #15
chesar, valeriikozlov, Привет ви ктота исправил ошибки в прозе частотного криптоанализа ?
Yandex
Объявления
28.09.2013, 21:47     Частотный анализ. Криптоанализ шифра замены. С++
Ответ Создать тему
Опции темы

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