Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2015, 03:00   #1
Drago56
Пользователь
 
Регистрация: 13.12.2010
Сообщений: 91
По умолчанию Криптоонализ шифра Виженера

Код:
#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string>
#include<conio.h>
#include <clocale>

using namespace std;
string s[16],buf;

void left( int a, int N){ //ôóíêöèÿ ñìåùåíèå íà 1 âëåâî
     char temp=buf[0];
     for (int i=0; i<N-1;i++) buf[i]=buf[i+1];
     buf[N-1]=temp;
     s[a]=buf;
}

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL, "Russian");
s[0]="МЭИЁЫРНЁЬЧГДКЧГЕЖЦМБХЩЭЪУЩЖЩЩДГГЧЛПИУНЛТФЮМГЬЮЩБЧЪЙЁОЪЗОПЧМЩПЦПИЭЬЖЮПЩМХНЪЙЁМЪЗЩЩГИЧАЭАЬЭЧЩМЪЛЛЙКЧМЕКБНЁЭЪБЫКДЛЬФШМЫПЭАТЬЪИАЧТЮШЩФАВЩЬЖОШРАЁЧАОЧХРЫЙЩЮРЁЦЭРТФШМГЩПМБВРЙЁМРИШЁЧЛЬТЛИЁШЩЩБЬЖЛЯШЛКЬШФРЁНЪГВКЮГЗУЩЖЕЬЦМЪЩНГГЖШМЮУООЧЯЛЯЬТЯУЁНЪСДУЬЮЩГРБЁЭРНЬЫЗАДЩЭИЩПЪЛЕУОВЬШРПГЮТЖГПЕГЙЩЧЪВЩГРЁЪЬЖЬАЛЙАТУЮЪЫЛЛАБЖБЫПЪЛЩЩЭНАЭЖАЧЦЭЭАЛЖЙЩЪРОЩЁХОЧТНМШДРПЙМРЮЕШЛНЧМЧМЩШЛНЗУНГЙЬЮАЁМЛЙЧПОМЖЩЦЙЁШЪКЁЭЩМИЙЕЖДЬКИГИПЭДЬЛКЁФЩЖЯГРЗАПЬЮЗАФЖЩПРПЧЦЪЛЬШЪЛЬЬШМЙЫКЛЧЗЮМЕУУЦЬПЫМИМЪГДЮЭМЗЭЯНЗУНГЙЬЮААПЫОАМФВЬМЪЦЬОДГЪЩЫЪЬЫЛАГУВГЧШЩЩЖКНЙЁМЩЩАТЪЯЗКУЖГЩЭЪШПЭНЁХЪЗИЭНМАЬЮОЧАЫМЫЩМЛТФЮМДЮЦМЙЩЬЩБМЖОЧСЛГЙЬКНЗУНЖЫПГГЪЩЩЖШЮПЪИЦФЦВЩШМЪЫЪКЕЩОМАШРПЩЩХПЙМРЛЕЩОМДПЭРКАЪРЦОРЗИЭНЖЙПЧЪЕЩЫЪЬЫМЩГШРПВЩЧЪВЩММГЖДГЫЫЯБААШСЮВФЛЩХЪКЕКЮГЕЩИРЁЭЭРЗКБКЁНЪРЕЩЭЖЙЖЭЭЙЩЧЪВЩЦРЁЧЯСДШЪККУНКЬЬЮГЗЩМИЁЧЯЛЧЛЧЬЫКЮГГЖЩМДЮФГИЭРПЙМРЛЕЩШСЩТОЙЦОЯМЙЦФХЧМДГДЮРБЁЩЮАИПБАФЭЪЗЪЩЭРАШЪЗ";
string s2="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
buf=s[0]; 
int k=0,i,koll[15]={0},j,poten[15]={0},q=0,k2=0,ind,alf[5][33]={0},j2;
float dol[15],max;
string y1,y2,y3,y4;
k=s[0].length();  

for(i=1;i<16;i++){
left(i,k);
for(j=0;j<k;j++) if(s[0][j]==s[i][j]) koll[i-1]++;
dol[i-1]=(float)koll[i-1]/k;
if(dol[i-1]>=0.053) {poten[q]=i;q++;}
//cout<<endl<<"Koll="<<koll[i-1];
}

//for(i=0;i<5;i++)
//for(j=0;j<33;j++)
//alf[i][j]=0;

for(i=0;i<15;i++) if(poten[i]!=0) k2++;

max=dol[0];ind=1;

for(i=0;i<15;i++) if(dol[i]>max) {max=dol[i];ind=i+1;}

j=0;
for(i=0;i<201;i++){
	//y1[i]=s[0][j];
	for(int b=0;b<33;b++)
	if(s[0][j]==s2[b]) alf[0][b]++;
	j=j+4;
}

j=1;
for(i=201;i<402;i++){
//	y2[i]=s[0][j];
		for(int b=0;b<33;b++)
	if(s[0][j]==s2[b]) alf[1][b]++;
	j=j+4;
}
j=2;
for(i=402;i<603;i++){
//	y3[i]=s[0][j];
		for(int b=0;b<33;b++)
	if(s[0][j]==s2[b]) alf[2][b]++;
	j=j+4;
}

j=3;
for(i=603;i<803;i++){
	//y4[i]=s[0][j];
		for(int b=0;b<33;b++)
	if(s[0][j]==s2[b]) alf[3][b]++;
	j=j+4;
}

                                  
for(j2=0;j2<ind;j2++){                    
 cout<<endl;
 for(i=0;i<33;i++)                 
    cout<<alf[j2][i]<<" ";          
}
      
//cout<<endl<<ind;       
cout<<endl<<endl;       
system("pause");       
	return 0;
}
Пытался делать по индексу совпадений как показано по ссылке

https://ru.wikipedia.org/wiki/%D0%98...BD%D0%B8%D0%B9

Дошел до статистике появлений букв в группах.
Не могу понять как узнать сколько нужно количество сдвигов в каждой группы, чтобы вычислить взаимный индекс совпадений
Drago56 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация шифра cast evklid Помощь студентам 0 31.05.2013 18:07
Взлом XOR-шифра Rad-X Помощь студентам 23 12.05.2013 20:25
Разгадка шифра saivs Общие вопросы Delphi 6 15.04.2013 18:28
Реализация книжного шифра!!! InnaSidorenko Помощь студентам 1 20.11.2012 21:23
Криптоанализ шифра Виженера kalbim Помощь студентам 3 17.05.2011 22:27