Написание программы, которая на основе входного текстового файла формирует таблицу частот символов (Лабораторная робота № 2), страница 3

            decrInt(argv[2],argv[3]);

            else if(!strcmp(argv[1], "--EW"))

            encrW(argv[2],argv[3]);

            else if(!strcmp(argv[1], "--DW"))

        decrW(argv[2],argv[3]);

            getch();

        return 0;

    }

Приклад роботи програми:

Завдання 3.

Используя программу из задания 1 произвести взлом зашифрованного текста в программе 2.

Кодпрограми:

// vzlom.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <fstream>

#include <iostream>

#include <iomanip>

#include <math.h>

#define ALF_VOL 100 //размер алфавита

#define OUT "rasp.txt" //файл для вывода закона распределения

#define IN "MESS.TXT" //входящее сообщение

using namespace std;

struct node1 { //cтруктура для хранения закона распределения частот

      char sym; //символ алфавита

      float pro; //вероятность символа

      bool used;

}ALF[ALF_VOL];

struct node2 { //cтруктура для хранения закона распределения частот

      char sym; //символ алфавита

      char zam;

      float pro; //вероятность символа

}ENC[ALF_VOL];

int av,ev;

void build() //заполнение таблиц вероятностей

{

      ifstream in1("ALF.txt"/*in_f1.c_str()*/);

      if ( !in1 )  //проверяем открылся ли файл

         cout <<"can`t open file 1 ";

      ifstream in2("ENC.txt"/*in_f2/*.c_str()*/);

      if ( !in2 )  //проверяем открылся ли файл

         cout <<"can`t open file 2 ";

      int i=0;

      while(in1) { //заполняем табл вероятностей русского языка

            in1>>ALF[i].sym;

            in1>>ALF[i].pro;

            ALF[i].used=false;

            i++;

      }

      av=i; //размер табл

      i=0;

      while(in2) { //заполняем табл вероятностей зашифр. сообщения

            in2>>ENC[i].sym;

            in2>>ENC[i].pro;

            i++;

      }

      ev=i; //размер табл

}

void comp() //сравнение частот

{

 int i=0,j=0;

 for(i=0;i<ev;i++) //сравниваем каждый символ с каждым

 {

       float min=1; //минимальная разница частот

       for(j=0;j<av;j++)

       {

             if(fabs(ENC[i].pro-ALF[j].pro)<min && !ALF[j].used) //ищем минимальную разницу частот

             {

                   ENC[i].zam=ALF[j].sym; //нашли - заменяем

                   ALF[j].used=true;

                   min=fabs(ENC[i].pro-ALF[j].pro);

             }

       }

 }

}

int _tmain(int argc, _TCHAR* argv[])

{

      setlocale(LC_ALL,".1251"); //работаем с русским алфавитом

      ifstream in("MESS.txt"/*in_f/*.c_str()*/);

      ofstream out("OUT.txt"/*in_f/*.c_str()*/);

      build();

      comp();

      char c;

      int fl=0;

      while(in.get( c )) { //читаем шифр

            c=toupper(c);

            cout<<c;

            fl=0;

            for(int i=0; i<ev && !fl;i++) //ищем считанный символ в таблице

            {

                  if(c==ENC[i].sym) //нашли - заменяем его на полученный при частотном анализе

                  {

                        out<<ENC[i].zam;

                        fl=1;

                  }

            }

            if(!fl) //не нашли - выводим как есть

                  out<<c;

      }

                  in.close();

            out.close();

      return 0;

}

Имеем исходный текст:

Применяем шифр Цезаря с ключом 10.

Строим закон распределения букв русского языка:

Строим закон распределения букв для нашего зашифрованного сообщения:

Применяем программу частотного анализа:

Уже появились узнаваемые слова. Заменяем символы, стоящие не на своем месте, с помощью программы.

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <fstream>

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

      setlocale(LC_ALL,".1251"); //работаем с русским алфавитом

      ifstream in("MESS.TXT");

      ifstream inf("ZAM.TXT");

      ofstream out("OUT.TXT");

      char a;

      char b;

      char c;

      inf>>a; //какой менять

      inf>>b; //на какой менять

      while(in.get( c )) { //читаем шифр

            if(c==a) //нашли нужный символ - меняем

                  out<<b;

            else //иначе выводим как есть

                  out<<c;

      }

      in.close();

      out.close();

      return 0;

}

Получаем  текст.