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;
}
Получаем текст.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.