МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
ЗВІТ
про виконання лабораторної роботи №6
на тему:
«МЕТОДИ ШИФРУВАННЯ ТА ДЕШИФРУВАННЯ»
З курсу «Проблемно-орієнтовані методи та засоби
комп’ютерних інформаційних технологій»
МЕТА РОБОТИ
Мета роботи - простих методів шифрування та дешифрування інформації та їх особливостей.
Прямі підстановки.
У прямих підстановках кожний знак початкового тексту замінюється одним або декількома знаками. Одним з важливих підкласів прямих підстановок є моноалфавітні підстановки, в яких встановлюється взаємооднозначна відповідність між кожним знаком аі алфавіту повідомлень А і відповідним знаком hj зашифрованого тексту.
Дуже простим прикладом перетворення секретної інформації є шифр Цезаря, який, за переказами, був використаний ще Юлієм Цезарем . Рядок знаків YGBPCGFBOQTGBUPQYBHQTBDCVVGTBUMKKPI є зашифрованою формою наступного повідомлення: WE NEED VORE SNOW FOR BETTER SKIING (Для кращого катання на лижах треба більше снігу).
Шифр Цезаря фактично являє собою окремий випадок методу моноалфавітної підстановки букв одного алфавіту. Кожний знак Р з початкового алфавіту замінюється відповідним числом Р(Р), [р(А)=1, р(В)==2,. ... р(Z)=26, пропуск = 0]. Потім формується еквівалентне зашифроване число у з рівняння
y(^)=p(Р) +2 (mod 27) (1)
Таким чином, у(Т)=р(Т)+2=20+2=22, у(1)=р(1)+2=9+2=11 і т. д.
Значення у потім заміняються відповідними їм буквами для отримання зашифрованого тексту.
Проілюструємо шифрування методом підстановки шифром який не є шифром Цезаря.
Початкове повідомлення: WE NEED MORE SNOW FOR BETTER SKIING.
Ключ:
вхід: bABCDEFGHIJKLMNOPQRTUVWXYZ
вихід: VZHLANQRCWDXFOUSPBTIELGMbKY
Зашифрований текст:
МNVUNNAVOSTNVIUSMVQSTVHNEENTVIXWWUR
Зашифроване повідомлення отримано таким чином. Беремо знак з початкового повідомлення в рядку ВХІД ключа і замінюємо його відповідним знаком з рядка ВИХІД.
Цей метод підстановки, хоч до деякої міри і є ефективним для заплутування при випадковому прочитанні, не зможе надовго зупинити досвідченого промислового шпигуна, оскільки він легко піддається здійснюваному за допомогою ЕОМ частотному аналізу зустрічності букв і пар букв.
Всі методи моноалфавітної підстановки можна представити як числові перетворення букв початкового тексту, що розглядаються як числа. Кожна буква в тексті множиться на деяке число (назване десятковим коефіцієнтом) і додається до деякого іншого числа (коефіцієнту зсуву)
с=(aP+s) mod K (2)
де: а - десятковий коефіцієнт; s - коефіцієнт зсуву. Результуюче число зменшується за правилом віднімання модуля K, де K - розмір алфавіту, і зашифрований текст формується із відповідних йому алфавітних еквівалентів. Неважко пересвідчитися, що рівняння (1) для шифру Цезаря є фактично рівнянням (2) з а =1, s=2, і K=27.
Існують машини, що мають команду ТРАНСЛЮВАТИ, яка забезпечує дуже легкі для використання шифри підстановки. Наприклад, на ІВМ 370 користувач встановлює таблицю з 256 байтів. Двійкове значення кожного байта, яке користувач хоче зашифрувати, використовується як індекс в таблиці для пошуку відповідного перетвореного байта. Це перетворення здійснюється за одну машинну команду.
Багатоалфавітні підстановки.
Проста багатоалфавітна підстановка послідовно і циклічно міняє алфавіти, що використовуються. При u-алфавітній підстановці знак т1, з початкового повідомлення замінюється знаком з алфавіту В1, т2 відповідним з алфавіту В2. .., ті - знаком з алфавіту Ві, mі+1 знову з алфавіту В1 і т. д.
ВХІДНИЙ ЗНАК: m1,m2,m3,m4,m5,m6,m7
АЛФАВІТ ПІДСТАНОВКИ: B1,B2,B3,B4,B5,B1,B2,.
Ефект використання багатоалфавітної підстановки полягає в тому, що забезпечується маскування природної частотної статистики початкової мови L, оскільки конкретний знак з алфавіту А може бути перетворений в декілька різних знаків шифрувального алфавіту В. Рівень захисту, що забезпечується теоретично, пропорційний довжині періоду в послідовності алфавітів, що використовуються.
Як приклад приведемо використання ключа восьмибуквенного слова SECURSTY, що повторюється для шифрування тексту. Запишемо під кожною початковою буквою відповідну букву ключа. Потім будемо розглядати алфавіт, як кільце, що складається з 27 символів. Привласнюючи відповідно значення 0-пропуск, 1-А, 2=В,...,26=Z, будемо мати восьмиалфавітиий шифр підстановки. Ми можемо розглядати перший алфавіт як такий що зсуває кожний знак, вміщений в кільце, на 19 (S), тобто W стає О, А стає Т, В стає U і т. д.; другий алфавіт, як зсуваючий кожний знак на 5 (Е), тобто Е стає J, А стає F, В стає G і т. д. Використовуючи додавання по модулю 27 отримаємо такий зашифрований текст:
WE NEED MORE SNOW FOR BETTER SKIING
SECURITYSECURITYSECURITYSECURITYSE
OJCHWNXYETUZRAGMOEIVCLYHLRADGASJ
Така проста багатоалфавітна підстановка (шифр Віжінера) з періодом и вимагає, щоб зловмисник мав в своєму розпорядженні принаймні 20и знаків, перехоплених в шифровці, до того як вона може бути розкрита.
G-контурна багатоалфавітна підстановка являє собою метод шифрування, що використовує g наборів алфавітів, що застосовуються циклічно з періодами u1,u2,…ug. Цей шифр розкрити значно складніше, ніж просту багатоалфавітну підстановку.
Монофонічні шифри
Монофонічний шифр являє собою багатоалфавітний шифр підстановки, що зрівнює частоту появи зашифрованих знаків і таким чином захищає шифрований текст від розкриття за допомогою частотного аналізу. Для знаків, що зустрічаються часто, потрібна відносно велика кількість зашифрованих еквівалентів. У той же час для знаків, що використовуються нечасто, може виявитися достатнім один або два зашифрованих знаки.
Загальні принципи для методів перетворення підстановкою.
Всі описані методи шифрування можна розглядати як задачі сучасної алгебри. Між К знаками алфавіту А і набором позитивних цілих чисел 0, 1,. ..,К-1 встановлюється довільна відповідність. При додаванні і відніманні по модулю К ці додатні цілі числа формують алгебраїчне кільце, що використовується для шифрування, а також однозначні зворотні перетворення. Тому якщо ми вибираємо ціле w в діапазоні від 0 до К-1, то цим самим автоматично проводимо вибір конкретного перетворення підстановкою ei=mi+w(mod k-1) і зворотнього перетворення mi=ei+(mod K-1).
Якщо w фіксоване, то ми маємо одноалфавітну підстановку. Якщо w вибирається з послідовності w1,w2,…wn, то ми маємо багатоалфавітну підстановку з періодом n.
Якщо в багатоалфавітній підстановці:
а) число знаків в ключі перевищує загальне число початкових знаків, що шифруються;
б) ключ використовується тільки один раз;
в) початковий текст не може бути викрадений зловмисником,
то зашифрований текст є теоретично таким, що нерозкривається і називається системою Вермена. Тому ми завжди прагнемо до довгих наборів знаків ключа. Як буде видно далі, ми можемо на практиці отримувати нескінченні ключові послідовності, які можуть бути використані в багатьох додатках.
Перестановки.
Знаки початкового тексту можна переставляти відповідно до деякого правила. Наприклад, знаки тексту в явній формі WE/NEED/MORE/SNOW/FOR/BETTER/SKIING можуть бути переставлені відповідно до ключа: “переставити угрупування з чотирьох букв, що знаходяться в порядку 1 2 3 4 в порядок 3 1 4 2”. Первинний текст спочатку розбивається на групи WE/N_EED/_ MORE_ /SNO_W/FO_R/BE_TTER_/SKI_ING+, а потім перетворюється в зашифрований текст: /WNE_DE/E_RMEO_N/OS_FWO/_BRE/_ETRT_K/IS_GIXN. Коса межа відповідає пропуску, а + пустому знаку, що використовується для доповнення початкового тексту. Часто з кожним початковим алфавітом використовується декілька пустих знаків (нулів). Однак, якщо зловмисник відгадає довжину угрупування, то він легко може потім зробити різні можливі перестановки, особливо використовуючи ЕОМ.
Частотний аналіз.
Більшість штучних мов (і всі природні мови) мають характерний частотний розподіл букв і інших знаків. Наприклад, буква Е найбільш часто зустрічається в англійській мові, а Z найбільш рідка. Однак це зовсім не говорить про те, що не будуть попадатися англійські (вихідні), повідомлення, в яких інша буква буде зустрічатися частіше, ніж Е, і рідше, ніж Z. Але для дуже великого числа англійських повідомлень можуть бути встановлені певні характерні частоти.
Більшість повідомлень, зашифрованих методом перестановки або одноалфавітної підстановки, зберігають характерний частотний розподіл і, таким чином, дають крипто-аналітику шлях до розкриття шифру. Криптоаналітики часто використовують індекс відповідності (ІС) для визначення того, чи знаходяться вони на правильному шляху.
По визначенню ІС являє собою оцінку суми квадратів імовірностей кожної букви. Це використовується особливо у тих випадках, коли об'єм зашифрованого тексту відносно великий. Шифровки, які дають значення ІС більші, ніж 0,066 (для англійської мови), самі повідомляють про те, що ймовірно використовувалася одноалфавітна підстановка, даючи, таким чином криптоаналітикам інструмент для того, щоб приступити до розгадки шифру. Якщо ІС знаходиться між 0,052 і 0,066, то, ймовірно, був використаний двохалфавітний шифр підстановки. Криптоаналітик просто бере символ, що найчастіше зустрічається, і передбачає, що це пропуск, потім бере наступний найбільш частий символ і передбачає, що це Е, і т.д., щоб прийти до можливого рішення. Цей процес можна автоматизувати застосувавши ЕОМ, однак аналіз можливих варіантів повідомлень повинна робити людина.
Справа дуже ускладнюється, коли криптоаналітик стикається з рівномірним розподілом символів (IС=1/26=0,038 для англійської мови), який виходить при використанні багатоалфавітної підстановки.
Індивідуальне завдання:
Ключ: µ(P%GIl@ў‚OcnоUx–4Z№УT+ы*кY|‡RV)гaЌ2'[/ХЃН®џ,qEихF1бS„N°БѓЫ-ч;іЅ¦‹·я LC3±eРќє9>vђ¬т7=dЙs…`Wfghijkmop8rbtuwyz{}~Ђ?&†€‰ЉJЊЋЏB‘’“”•—™љ›њћ"MЎЈ¤Ґ§Ё©Є«\A.Ї_QІ^ґ ¶Kё!»јHѕїАВГДЕЖЗИ$КЛМ0ОП:СТФЦЧШЩЪ ЬЭЮЯаXв#дежзй6лмнпрс]уф5цDшщъьэю
Текст повідомлення, що буде шифруватися:
He had never seen dogs fight as these wolfish creatures fought, and his first experience taught him an unforgettable lesson. it is true, it was a vicarious experience, else he would not have lived to profit by it. Curly was the victim. They were camped near the log store, where she, in her friendly way, made advances to a husky dog the size of a full-grown wolf, though not half so large as she. There was no warning, only a leap in like a flash, a metallic clip of teeth, a leap out equally swift, and Curly’s face was ripped open from eye to jaw.
It was the wolf manner of fighting, to strike and leap away; but there was more to it than this. Thirty or forty huskies ran to the spot and surrounded the combatants in an intent and silent circle. Buck did not comprehend that silent intentness, nor the eager way with which they were licking their chops. Curly rushed her antagonist, who struck again and leaped aside. He met her next rush with his chest, in a peculiar fashion that tumbled her off her feet. She never regained them. This was what the onlooking huskies had waited for. They closed in upon her, snarling and yelping, and she was buried, screaming with agony, beneath the bristling mass of bodies.
So sudden was it, and so unexpected, that Buck was taken aback. He saw Spitz run out his scarlet tongue in a way he had of laughing; and he saw Francois, swinging an axe, spring into the mess of dogs. Three men with clubs were helping him to scatter them. It did not take long. Two minutes from the time Curly went down, the last of her assailants were clubbed off. But she lay there limp and lifeless in the bloody, trampled snow, almost literally torn to pieces, the swart half-breed standing over her and cursing horribly. The scene often came back to Buck to trouble him in his sleep. So that was the way. No fair play. Once down, that was the end of you. Well, he would see to it that he never went down. Spitz ran out his tongue and laughed again, and from that moment Buck hated him with a bitter and deathless hatred.
Before he had recovered from the shock caused by the tragic passing of Curly, he received another shock. Francois fastened upon him an arrangement of straps and buckles. It was a harness, such as he had seen the grooms put on the horses at home. And as he had seen horses work, so he was set to work, hauling Francois on a sled to the forest that fringed the valley, and returning with a load of firewood. Though his dignity was sorely hurt by thus being made a draught animal, he was too wise to rebel. He buckled down with a will and did his best, though it was all new and strange. Francois was stern, demanding instant obedience, and by virtue of his whip receiving instant obedience; while Dave, who was an experienced wheeler, nipped Buck’s hindquarters whenever he was in error. Spitz was the leader, likewise experienced, and while he could not always get at Buck, he growled sharp reproof now and again, or cunningly threw his weight in the traces to jerk Buck into the way he should go. Buck learned easily, and under the combined tuition of his two mates and Francois made remarkable progress. Ere they returned to camp he knew enough to stop at “ho,” to go ahead at “mush,” to swing wide on the bends, and to keep clear of the wheeler when the loaded sled shot downhill at their heels.
“Three very good dogs,” Francois told Perrault. “Dat Buck, him pull like hell. I teach him quick as anything.” By afternoon, Perrault, who was in a hurry to be on the trail with his dispatches, returned with two more dogs.
“Billee” and “Joe” he called them, two brothers, and true huskies both. Sons of the one mother though they were, they were different as day and night. Billee’s one fault was his excessive good nature, while Joe was the very opposite, sour and introspective, with a perpetual snarl and a malignant eye. Buck received them in comradely fashion, Dave ignored them, while Spitz proceeded to thrash first one and then the other. Billee wagged his tail appeasingly, turned to run when he saw that appeasement was of no avail, and cried (still appeasingly) when Spitz’s sharp teeth scored his flank. But no matter how Spitz circled, Joe whirled around on his heels to face him, mane bristling, ears laid back, lips writhing and snarling, jaws clipping together as fast as he could snap, and eyes diabolically gleaming—the incarnation of belligerent fear. So terrible was his appearance that Spitz was forced to forego disciplining him; but to cover his own discomfiture he turned upon the inoffensive and wailing Billee and drove him to the confines of the camp.
By evening Perrault secured another dog, an old husky, long and lean and gaunt, with a battle-scarred face and a single eye which flashed a warning of prowess that commanded respect. He was called Solleks, which means the Angry One.
Like Dave, he asked nothing, gave nothing, expected nothing: and when he marched slowly and deliberately into their midst, even Spitz left him alone. he had one peculiarity which Buck was unlucky enough to discover. He did not like to be approached on his blind side. Of this offense Buck was unwittingly guilty, and the first knowledge he had of his indiscretion was when Solleks whirled upon him and slashed his shoulder to the bone for three inches up and down.
Forever after Buck avoided his blind side, and to the last of their comradeship had no more trouble. His only apparent ambition, like Dave’s, was to be left alone; though, as Buck was afterward to learn, each of them possessed one other and even more vital ambition.
That night Buck faced the great problem of sleeping.
The tent, illumined by a candle, glowed warmly in the midst of the white plain; and when he, as a matter of course, entered it, both Perrault and Francois bombarded him with curses and cooking utensils, till he recovered from his consternation and fled ignominiously into the outer cold. A chill wind was blowing that nipped him sharply and bit with especial venom into his wounded shoulder. He lay down on the snow and attempted to sleep, but the frost soon drove him shivering to his feet. Miserable and disconsolate, he wandered about among the many tents, only to find that one place was as cold as another. Here and there savage dogs rushed upon him, but he bristled his neck-hair and snarled (for he was learning fast) and they let him go his way unmolested.
Finally an idea came to him. He would return and see how his own teammates were making out. To his astonishment, they had disappeared. Again he wandered about through the great camp, looking for them, and again he returned. Were they in the tent? No, that could not be, else he would not have been driven out. Then where could they possibly be? With drooping tail and shivering body, very forlorn indeed, he aimlessly circled the tent. Suddenly the snow gave way beneath his fore legs and he sank down. Something wriggled under his feet. He sprang back, bristling and snarling, fearful of the unseen and unknown. But a friendly little yelp reassured him, and he went back to investigate. A whiff of warm air ascended to his nostrils, and there, curled up under the snow in a snug ball, lay Billee. He whined placatingly, squirmed and wriggled to show his good will and intentions, and even ventured, as a bribe for peace, to lick Buck’s face with his warm wet tongue.
Текст програми шифрування повідомлення :
Для шифрування нам потрібен текст повідомлення, і ключ.
#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
#include <conio.h>
#include <string.h>
#pragma hdrstop
//---------------------------------------------------------------------------
char todo;
char path[50];
const int keyLen = 256;
char* encode(char*);
char* decode(char*);
bool main(int argc, char* argv[])
{
clrscr();
if(argc==1)
{
cout<<"Encode - 0"<<endl<<"Decode - 1"<<endl;
cin.get(todo);
switch(todo)
{
case '0': cout<<"Text file name to encode: "; cin>>path; cout<<encode(path);break;
case '1': cout<<"Text file name to decode: "; cin>>path; cout<<decode(path);break;
default: cout<<"Text file name to encode: "; cin>>path; cout<<encode(path);break;
}
}else
if(argc==3)
{
if (strcmp(argv[1],"/e")==false) cout<<encode(argv[2]);
if (strcmp(argv[1],"/d")==false) cout<<decode(argv[2]);
}
else {cout<<"bad arguments"; return false;}
getch();
return true;
}
char* encode(char* name)
{
char mKey[keyLen];
ifstream key;
//----------------------------------------------
key.open("key.bin");
int k = 0;
while(key)
{
key.get(mKey[k]);
k++;
}
key.close();
//----------------------------------------------
ifstream infile;
infile.open(name,ios::in);
if(!infile){infile.close(); return "Bad filename"; }
//----------------------------------------------
ofstream outfile;
outfile.open("encoded.dat");
//----------------------------------------------
char tmp;
while(infile.get(tmp))
{
outfile<<mKey[(int)tmp];
}
//----------------------------------------------
outfile.close();
infile.close();
//----------------------------------------------
return "done";
}
char* decode(char* name)
{
char mKey[keyLen];
char abc[keyLen];
for(int i = 0; i<keyLen; i++)
abc[i] = (char)i;
ifstream key;
key.open("key.bin",ios::in);
int k = 0;
while(key)
{
key.get(mKey[k]);
k++;
}
key.close();
ifstream infile;
infile.open(name,ios::out);
if(!infile){infile.close(); return "Bad Filename"; }
ofstream outfile;
outfile.open("decoded.txt");
char tmp;
while(infile.get(tmp))
{
for(int i = 0; i<keyLen; i++)
if(mKey[i]==tmp)
{
cout << abc[i];
outfile.put(abc[i]);
break;
}
}
outfile.close();
infile.close();
return "done";
}
Зашифрований текст:
ЅWRhЙ`RWWrRbWWR`ogbRfightRЙbRthWbWRwofibhR…rWЙturWbRfoughtНRЙ`RhibRfirbtRWpWriW…WRtЙughtRhimRЙRuforgWttЙsWRWbbo®RitRibRtruWНRitRwЙbRЙRi…ЙrioubRWpWriW…WНRWbWRhWRwou`RotRhЙWRiW`RtoRprofitRsyRit®RчuryRwЙbRthWRi…tim®RhWyRwWrWR…ЙmpW`RWЙrRthWRogRbtorWНRwhWrWRbhWНRiRhWrRfriW`yRwЙyНRmЙ`WRЙ`Й…WbRtoRЙRhubkyR`ogRthWRbizWRofRЙRfugrowRwofНRthoughRotRhЙfRboRЙrgWRЙbRbhW®RhWrWRwЙbRoRwЙrigНRoyRЙRWЙpRiRikWRЙRfЙbhНRЙRmWtЙi…R…ipRofRtWWthНRЙRWЙpRoutRW8uЙyRbwiftНRЙ`RчurybRfЙ…WRwЙbRrippW`RopWRfromRWyWRtoRjЙw®ўRRR¦tRwЙbRthWRwofRmЙWrRofRfightigНRtoRbtrikWRЙ`RWЙpRЙwЙy„RsutRthWrWRwЙbRmorWRtoRitRthЙRthib®RhirtyRorRfortyRhubkiWbRrЙRtoRthWRbpotRЙ`Rburrou`W`RthWR…omsЙtЙtbRiRЙRitWtRЙ`RbiWtR…ir…W®R-u…kR`i`RotR…omprWhW`RthЙtRbiWtRitWtWbbНRorRthWRWЙgWrRwЙyRwithRwhi…hRthWyRwWrWRi…kigRthWirR…hopb®RчuryRrubhW`RhWrRЙtЙgoibtНRwhoRbtru…kRЙgЙiRЙ`RWЙpW`RЙbi`W®RЅWRmWtRhWrRWtRrubhRwithRhibR…hWbtНRiRЙRpW…uiЙrRfЙbhioRthЙtRtumsW`RhWrRoffRhWrRfWWt®RРhWRWWrRrWgЙiW`RthWm®RhibRwЙbRwhЙtRthWRoookigRhubkiWbRhЙ`RwЙitW`Rfor®RhWyR…obW`RiRupoRhWrНRbЙrigRЙ`RyWpigНRЙ`RbhWRwЙbRsuriW`НRb…rWЙmigRwithRЙgoyНRsWWЙthRthWRsribtigRmЙbbRofRso`iWb®ўRRRРoRbu``WRwЙbRitНRЙ`RboRuWpW…tW`НRthЙtR-u…kRwЙbRtЙkWRЙsЙ…k®RЅWRbЙwRРpitzRruRoutRhibRb…ЙrWtRtoguWRiRЙRwЙyRhWRhЙ`RofRЙughig„RЙ`RhWRbЙwRіrЙ…oibНRbwigigRЙRЙWНRbprigRitoRthWRmWbbRofR`ogb®RhrWWRmWRwithR…usbRwWrWRhWpigRhimRtoRb…ЙttWrRthWm®R¦tR`i`RotRtЙkWRog®RwoRmiutWbRfromRthWRtimWRчuryRwWtR`owНRthWRЙbtRofRhWrRЙbbЙiЙtbRwWrWR…ussW`Roff®R-utRbhWRЙyRthWrWRimpRЙ`RifWWbbRiRthWRsoo`yНRtrЙmpW`RbowНRЙmobtRitWrЙyRtorRtoRpiW…WbНRthWRbwЙrtRhЙfsrWW`RbtЙ`igRoWrRhWrRЙ`R…urbigRhorrisy®RhWRb…WWRoftWR…ЙmWRsЙ…kRtoR-u…kRtoRtrousWRhimRiRhibRbWWp®RРoRthЙtRwЙbRthWRwЙy®RLoRfЙirRpЙy®RC…WR`owНRthЙtRwЙbRthWRW`RofRyou®R WНRhWRwou`RbWWRtoRitRthЙtRhWRWWrRwWtR`ow®RРpitzRrЙRoutRhibRtoguWRЙ`RЙughW`RЙgЙiНRЙ`RfromRthЙtRmomWtR-u…kRhЙtW`RhimRwithRЙRsittWrRЙ`R`WЙthWbbRhЙtrW`®ўRRR-WforWRhWRhЙ`RrW…oWrW`RfromRthWRbho…kR…ЙubW`RsyRthWRtrЙgi…RpЙbbigRofRчuryНRhWRrW…WiW`RЙothWrRbho…k®RіrЙ…oibRfЙbtWW`RupoRhimRЙRЙrrЙgWmWtRofRbtrЙpbRЙ`Rsu…kWb®R¦tRwЙbRЙRhЙrWbbНRbu…hRЙbRhWRhЙ`RbWWRthWRgroombRputRoRthWRhorbWbRЙtRhomW®R`RЙbRhWRhЙ`RbWWRhorbWbRworkНRboRhWRwЙbRbWtRtoRworkНRhЙuigRіrЙ…oibRoRЙRbW`RtoRthWRforWbtRthЙtRfrigW`RthWRЙWyНRЙ`RrWturigRwithRЙRoЙ`RofRfirWwoo`®RhoughRhibR`igityRwЙbRborWyRhurtRsyRthubRsWigRmЙ`WRЙR`rЙughtRЙimЙНRhWRwЙbRtooRwibWRtoRrWsW®RЅWRsu…kW`R`owRwithRЙRwiRЙ`R`i`RhibRsWbtНRthoughRitRwЙbRЙRWwRЙ`RbtrЙgW®RіrЙ…oibRwЙbRbtWrНR`WmЙ`igRibtЙtRosW`iW…WНRЙ`RsyRirtuWRofRhibRwhipRrW…WiigRibtЙtRosW`iW…W„RwhiWRЙWНRwhoRwЙbRЙRWpWriW…W`RwhWWWrНRippW`R-u…kbRhi`8uЙrtWrbRwhWWWrRhWRwЙbRiRWrror®RРpitzRwЙbRthWRWЙ`WrНRikWwibWRWpWriW…W`НRЙ`RwhiWRhWR…ou`RotRЙwЙybRgWtRЙtR-u…kНRhWRgrowW`RbhЙrpRrWproofRowRЙ`RЙgЙiНRorR…uigyRthrWwRhibRwWightRiRthWRtrЙ…WbRtoRjWrkR-u…kRitoRthWRwЙyRhWRbhou`Rgo®R-u…kRWЙrW`RWЙbiyНRЙ`Ru`WrRthWR…omsiW`RtuitioRofRhibRtwoRmЙtWbRЙ`RіrЙ…oibRmЙ`WRrWmЙrkЙsWRprogrWbb®R;rWRthWyRrWturW`RtoR…ЙmpRhWRkWwRWoughRtoRbtopRЙtR hoНtRtoRgoRЙhWЙ`RЙtR mubhНtRtoRbwigRwi`WRoRthWRsW`bНRЙ`RtoRkWWpR…WЙrRofRthWRwhWWWrRwhWRthWRoЙ`W`RbW`RbhotR`owhiRЙtRthWirRhWWb®ў hrWWRWryRgoo`R`ogbНtRіrЙ…oibRto`R3WrrЙut®R ЙtR-u…kНRhimRpuRikWRhW®R¦RtWЙ…hRhimR8ui…kRЙbRЙythig®tR-yRЙftWrooНR3WrrЙutНRwhoRwЙbRiRЙRhurryRtoRsWRoRthWRtrЙiRwithRhibR`ibpЙt…hWbНRrWturW`RwithRtwoRmorWR`ogb®ўRRR -iWWtRЙ`R ‹oWtRhWR…ЙW`RthWmНRtwoRsrothWrbНRЙ`RtruWRhubkiWbRsoth®RРobRofRthWRoWRmothWrRthoughRthWyRwWrWНRthWyRwWrWR`iffWrWtRЙbR`ЙyRЙ`Right®R-iWWbRoWRfЙutRwЙbRhibRW…WbbiWRgoo`RЙturWНRwhiWR‹oWRwЙbRthWRWryRoppobitWНRbourRЙ`RitrobpW…tiWНRwithRЙRpWrpWtuЙRbЙrRЙ`RЙRmЙigЙtRWyW®R-u…kRrW…WiW`RthWmRiR…omrЙ`WyRfЙbhioНRЙWRigorW`RthWmНRwhiWRРpitzRpro…WW`W`RtoRthrЙbhRfirbtRoWRЙ`RthWRthWRothWr®R-iWWRwЙggW`RhibRtЙiRЙppWЙbigyНRturW`RtoRruRwhWRhWRbЙwRthЙtRЙppWЙbWmWtRwЙbRofRoRЙЙiНRЙ`R…riW`R[btiRЙppWЙbigy/RwhWRРpitzbRbhЙrpRtWWthRb…orW`RhibRfЙk®R-utRoRmЙttWrRhowRРpitzR…ir…W`НR‹oWRwhirW`RЙrou`RoRhibRhWWbRtoRfЙ…WRhimНRmЙWRsribtigНRWЙrbRЙi`RsЙ…kНRipbRwrithigRЙ`RbЙrigНRjЙwbR…ippigRtogWthWrRЙbRfЙbtRЙbRhWR…ou`RbЙpНRЙ`RWyWbR`iЙsoi…ЙyRgWЙmig thWRi…ЙrЙtioRofRsWigWrWtRfWЙr®RРoRtWrrisWRwЙbRhibRЙppWЙrЙ…WRthЙtRРpitzRwЙbRfor…W`RtoRforWgoR`ib…ipiigRhim„RsutRtoR…oWrRhibRowR`ib…omfiturWRhWRturW`RupoRthWRioffWbiWRЙ`RwЙiigR-iWWRЙ`R`roWRhimRtoRthWR…ofiWbRofRthWR…Йmp®ўRRR-yRWWigR3WrrЙutRbW…urW`RЙothWrR`ogНRЙRo`RhubkyНRogRЙ`RWЙRЙ`RgЙutНRwithRЙRsЙttWb…ЙrrW`RfЙ…WRЙ`RЙRbigWRWyWRwhi…hRfЙbhW`RЙRwЙrigRofRprowWbbRthЙtR…ommЙ`W`RrWbpW…t®RЅWRwЙbR…ЙW`RРoWkbНRwhi…hRmWЙbRthWRgryRCW®ўRRRяikWRЙWНRhWRЙbkW`RothigНRgЙWRothigНRWpW…tW`RothigSRЙ`RwhWRhWRmЙr…hW`RbowyRЙ`R`WisWrЙtWyRitoRthWirRmi`btНRWWRРpitzRWftRhimRЙoW®RhWRhЙ`RoWRpW…uiЙrityRwhi…hR-u…kRwЙbRuu…kyRWoughRtoR`ib…oWr®RЅWR`i`RotRikWRtoRsWRЙpproЙ…hW`RoRhibRsi`Rbi`W®RCfRthibRoffWbWR-u…kRwЙbRuwittigyRguityНRЙ`RthWRfirbtRkowW`gWRhWRhЙ`RofRhibRi`ib…rWtioRwЙbRwhWRРoWkbRwhirW`RupoRhimRЙ`RbЙbhW`RhibRbhou`WrRtoRthWRsoWRforRthrWWRi…hWbRupRЙ`R`ow®ўRRRіorWWrRЙftWrR-u…kRЙoi`W`RhibRsi`Rbi`WНRЙ`RtoRthWRЙbtRofRthWirR…omrЙ`WbhipRhЙ`RoRmorWRtrousW®RЅibRoyRЙppЙrWtRЙmsitioНRikWRЙWbНRwЙbRtoRsWRWftRЙoW„RthoughНRЙbR-u…kRwЙbRЙftWrwЙr`RtoRWЙrНRWЙ…hRofRthWmRpobbWbbW`RoWRothWrRЙ`RWWRmorWRitЙRЙmsitio®ўRRRhЙtRightR-u…kRfЙ…W`RthWRgrWЙtRprosWmRofRbWWpig®ўRRRhWRtWtНRiumiW`RsyRЙR…Й`WНRgowW`RwЙrmyRiRthWRmi`btRofRthWRwhitWRpЙi„RЙ`RwhWRhWНRЙbRЙRmЙttWrRofR…ourbWНRWtWrW`RitНRsothR3WrrЙutRЙ`RіrЙ…oibRsomsЙr`W`RhimRwithR…urbWbRЙ`R…ookigRutWbibНRtiRhWRrW…oWrW`RfromRhibR…obtWrЙtioRЙ`RfW`RigomiioubyRitoRthWRoutWrR…o`®RR…hiRwi`RwЙbRsowigRthЙtRippW`RhimRbhЙrpyRЙ`RsitRwithRWbpW…iЙRWomRitoRhibRwou`W`Rbhou`Wr®RЅWRЙyR`owRoRthWRbowRЙ`RЙttWmptW`RtoRbWWpНRsutRthWRfrobtRbooR`roWRhimRbhiWrigRtoRhibRfWWt®R ibWrЙsWRЙ`R`ib…oboЙtWНRhWRwЙ`WrW`RЙsoutRЙmogRthWRmЙyRtWtbНRoyRtoRfi`RthЙtRoWRpЙ…WRwЙbRЙbR…o`RЙbRЙothWr®RЅWrWRЙ`RthWrWRbЙЙgWR`ogbRrubhW`RupoRhimНRsutRhWRsribtW`RhibRW…khЙirRЙ`RbЙrW`R[forRhWRwЙbRWЙrigRfЙbt/RЙ`RthWyRWtRhimRgoRhibRwЙyRumoWbtW`®ўRRRіiЙyRЙRi`WЙR…ЙmWRtoRhim®RЅWRwou`RrWturRЙ`RbWWRhowRhibRowRtWЙmmЙtWbRwWrWRmЙkigRout®RoRhibRЙbtoibhmWtНRthWyRhЙ`R`ibЙppWЙrW`®RgЙiRhWRwЙ`WrW`RЙsoutRthroughRthWRgrWЙtR…ЙmpНRookigRforRthWmНRЙ`RЙgЙiRhWRrWturW`®R WrWRthWyRiRthWRtWtѓRLoНRthЙtR…ou`RotRsWНRWbWRhWRwou`RotRhЙWRsWWR`riWRout®RhWRwhWrWR…ou`RthWyRpobbisyRsWѓR ithR`roopigRtЙiRЙ`RbhiWrigRso`yНRWryRfororRi`WW`НRhWRЙimWbbyR…ir…W`RthWRtWt®RРu``WyRthWRbowRgЙWRwЙyRsWWЙthRhibRforWRWgbRЙ`RhWRbЙkR`ow®RРomWthigRwriggW`Ru`WrRhibRfWWt®RЅWRbprЙgRsЙ…kНRsribtigRЙ`RbЙrigНRfWЙrfuRofRthWRubWWRЙ`Rukow®R-utRЙRfriW`yRittWRyWpRrWЙbburW`RhimНRЙ`RhWRwWtRsЙ…kRtoRiWbtigЙtW®RRwhiffRofRwЙrmRЙirRЙb…W`W`RtoRhibRobtribНRЙ`RthWrWНR…urW`RupRu`WrRthWRbowRiRЙRbugRsЙНRЙyR-iWW®RЅWRwhiW`RpЙ…ЙtigyНRb8uirmW`RЙ`RwriggW`RtoRbhowRhibRgoo`RwiRЙ`RitWtiobНRЙ`RWWRWturW`НRЙbRЙRsrisWRforRpWЙ…WНRtoRi…kR-u…kbRfЙ…WRwithRhibRwЙrmRwWtRtoguW®ў
Частотні таблиці:
Текст програми підрахунку частоти повторюваності символів:
//---------------------------------------------------------------------------
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
int allCharCount = 0;
const int LEN = 256;
typedef unsigned long ulong;
class tablEl
{
private :
ulong charCount;
char Char;
double hz;
public :
tablEl(){Char = 0;charCount = 0; hz = 0.0;}
tablEl(char tmp)
{
Char = tmp;
charCount = 0;
hz = 0.0;
}
void incrementCharCount()
{
charCount++;
}
ulong getCharCount()
{
return charCount;
}
char getChar()
{
return Char;
}
double setHz()
{
hz = (double)charCount/allCharCount;
return hz;
}
} *mass[LEN];
bool main(int argc, char* argv[])
{
for (int i=0; i<LEN; i++)
mass[i] = new tablEl((char)i);
ifstream infile;
infile.open("test.txt",ios::in);
char ch;
ofstream outfile;
outfile.open("table.bin",ios::out);
if(infile)
while(infile)
{
infile.get(ch);
mass[(int)ch]->incrementCharCount();
allCharCount++;
}
else {outfile.close(); infile.close(); return false; }
cout<<"Total chars: "<<allCharCount<<endl;
for(int i=0; i<LEN; i++)
outfile<<mass[i]->setHz()<<endl;
outfile.close();
infile.close();
cout<<"done";
getch();
return true;
}
//---------------------------------------------------------------------------
Декодування зашифрованого тексту проходить в один етап.
Текст програми для підбору ключа до зашифрованого тексту:
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#pragma hdrstop
//---------------------------------------------------------------------------
int allCharCount = 0;
const int LEN = 256;
typedef unsigned long ulong;
ulong all = 0;
class tablEl
{
private :
ulong charCount;
char Char;
double hz;
public :
tablEl(){Char = 0;charCount = 0; hz = 0.0;}
tablEl(char tmp)
{
Char = tmp;
charCount = 0;
hz = 0.0;
}
void incrementCharCount()
{
charCount++;
}
char getChar()
{
return this->Char;
}
void setHz(double tmp)
{
this->hz = tmp;
}
double getHz()
{
return this->hz;
}
void countHz()
{
hz = (double)charCount/allCharCount;
}
} *mass[LEN], *encoded[LEN];
int main(int argc,char* argv[])
{
clrscr();
for(int i = 0; i< LEN; i++)
encoded[i] = new tablEl((char)i);
//----------------------------------------------------------------------
ifstream table;
table.open("table.bin",ios::in);
double tmp;
if(table)
{
int count = 0;
while(table>>tmp)
{ mass[count] = new tablEl((char)count);
mass[count]->setHz(tmp);
count++;
}
}
else {table.close(); return 0; }
table.close();
//----------------------------------------------------------------------
ifstream data;
data.open("encoded.bin",ios::in);
if(data)
{
int ch;
while(data)
{
ch = data.get();
encoded[ch]->incrementCharCount();
allCharCount++;
}
ofstream of1;
of1.open("encoded_table.bin",ios::out);
for(int i = 0; i< LEN; i++)
{
encoded[i]->countHz();
of1<<encoded[i]->getHz()<<endl;
}
of1.close();
data.close();
//----------------------------
ofstream outfile;
outfile.open("hacked.txt");
ifstream data;
data.open("encoded.bin",ios::in);
char c;
while(data)
{
data.get(c);
for(int i = 0; i<LEN; i++)
if(c == encoded[i]->getChar())
{
double rizn = 5.0;
int index;
for(int j = 0; j < LEN; j++)
{
if(mass[j]->getHz()==0.)continue;
if(mass[j]->getHz()>encoded[i]->getHz())
{
if(mass[j]->getHz() - encoded[i]->getHz() < rizn)
{
rizn = mass[j]->getHz()-encoded[i]->getHz();
index = j;
}
}
else if(encoded[i]->getHz() - mass[j]->getHz()< rizn)
{
rizn = encoded[i]->getHz() - mass[j]->getHz();
index = j;
}
}
outfile<<mass[index]->getChar();
continue;
}
}
outfile.close();
//----------------------------
}
else {data.close(); return 0;}
cout<<"done";
data.close();
//----------------------------------------------------------------------
getch();
return 1;
}
Розшифрований текст:
'e iol aeken neea lipn fipio on oiene dilfini yneoocnen ficpiof oal iin finno eWfenieaye oocpio iif oa cafinpeoooble lennia, io in oncef io don o kiyoniicn eWfenieayef elne ie dicll aio ioke likel oi fnifio bg io, Fcnlg don oie kiyoif, Cieg dene yoffel aeon oie lip noinef diene nief ia ien fnieallg dogf fole olkoayen oi o icnvg lip oie niWe if o fcll6pnida dilff oiicpi aio iolf ni lonpe on nie, Ciene don ai donaiapf ialg o leof ia live o flonif o feoolliy ylif if oeeoif o leof ico e6collg ndifof oal FcnlgDn foye don niffel ifea fnif ege oi 7od,' 6o don oie dilf foaaen if fipioiapf oi nonive oal leof odogD bco oiene don fine oi io oioa oiin, Ciinog in finog icnvien noa oi oie nfio oal ncnnicalel oie yifboooaon ia oa iaoeao oal nileao yinyle, Tcyv lil aio yiffneieal oioo nileao iaoeaoaennf ain oie eopen dog dioi diiyi oieg dene liyviap oiein yiifn, Fcnlg ncniel ien oaoopiainof dii noncyv opoia oal leofel onile, 'e feo ien aeWo ncni dioi iin yienof ia o feyclion foniiia oioo ocfblel ien iff ien feeo, Sie aeken nepoiael oief, Ciin don dioo oie ialiiviap icnvien iol doioel fin, Cieg ylinel ia cfia ienf naonliap oal gelfiapf oal nie don bcnielf nyneofiap dioi opiagf beaeooi oie bninoliap fonn if bilien,' Si ncllea don iof oal ni caeWfeyoelf oioo Tcyv don oovea oboyv, 'e nod SfioW nca ico iin nyonleo oiapce ia o dog ie iol if locpiiapD oal ie nod Wnoayiinf ndiapiap oa oWef nfniap iaoi oie fenn if lipn, Cinee fea dioi ylcbn dene ielfiap iif oi nyoooen oief, 6o lil aio oove liap, Cdi fiacoen fnif oie oife Fcnlg deao lidaf oie lono if ien onnoiloaon dene ylcbbel iff, Tco nie log oiene liff oal lifelenn ia oie bliilgf onofflel naidf olfino lioenollg oina oi fieyenf oie ndono iolf6bneel nooaliap iken ien oal ycnniap iinniblg, Cie nyeae ifoea yofe boyv oi Tcyv oi onicble iif ia iin nleef, Si oioo don oie dog, 9i foin flog, 7aye lidaf oioo don oie eal if gic, 7ellf ie dicll nee oi io oioo ie aeken deao lida, SfioW noa ico iin oiapce oal locpiel opoiaf oal fnif oioo fifeao Tcyv iooel iif dioi o biooen oal leooilenn ioonel,' Tefine ie iol neyikenel fnif oie niiyv yocnel bg oie onopiy fonniap if Fcnlgf ie neyeikel oaioien niiyv, Wnoayiin fonoeael cfia iif oa onnoapefeao if nonofn oal bcyvlen, 6o don o ionaennf ncyi on ie iol neea oie pniifn fco ia oie iinnen oo iife, Fal on ie iol neea iinnen dinvf ni ie don neo oi dinvf iocliap Wnoayiin ia o nlel oi oie fineno oioo fniapel oie kollegf oal neocnaiap dioi o liol if finediil, Ciicpi iin lipaiog don ninelg icno bg oicn beiap fole o lnocpio oaifolf ie don oii dine oi nebel, 'e bcyvlel lida dioi o dill oal lil iin benof oiicpi io don oll aed oal nonoape, Wnoayiin don noenaf lefoaliap ianooao ibelieayef oal bg kinoce if iin diif neyeikiap ianooao ibelieayeD diile Fokef dii don oa eWfenieayel dieelenf aiffel TcyvDn iial6conoenn dieaeken ie don ia ennin, SfioW don oie leolenf livedine eWfenieayelf oal diile ie yicll aio oldogn peo oo Tcyvf ie pnidlel nionf nefniif aid oal opoiaf in ycaaiaplg oined iin deipio ia oie onoyen oi 7env Tcyv iaoi oie dog ie niicll pi, Tcyv leonael eonilgf oal calen oie yifbiael ocioiia if iin odi fooen oal Wnoayiin fole nefonvoble fnipnenn, ?ne oieg neocnael oi yoff ie vaed eaicpi oi noif oo Biifo oi pi oieol oo Bfcnifo oi ndiap dile ia oie bealnf oal oi veef yleon if oie dieelen diea oie liolel nlel niio lidaiill oo oiein ieeln,'BCinee keng piil lipnfo Wnoayiin oill 6ennoclo, BFoo Tcyvf iif fcll live iell, 6 oeoyi iif 6ciyv on oagoiiap,o Tg ofoenaiiaf 6ennoclof dii don ia o icnng oi be ia oie onoil dioi iin linfooyienf neocnael dioi odi fine lipn,' BTilleeo oal B7ieo ie yollel oieff odi bnioiennf oal once icnvien bioi, Sian if oie iae fioien oiicpi oieg denef oieg dene liffeneao on log oal aipio, TilleeDn iae foclo don iin eWyennike piil aoocnef diile 7ie don oie keng iffinioef nicn oal iaoninfeyoikef dioi o fenfeocol naonl oal o folipaoao ege, Tcyv neyeikel oief ia yifnolelg foniiiaf Foke ipainel oieff diile SfioW fniyeelel oi oinoni finno iae oal oiea oie ioien, Tillee doppel iin ooil offeoniaplgf ocnael oi nca diea ie nod oioo offeonefeao don if ai okoilf oal yniel 9noill offeoniaplg9 diea SfioWDn nionf oeeoi nyinel iin floav, Tco ai foooen iid SfioW yinylelf 7ie diinlel onical ia iin ieeln oi foye iiff foae bninoliapf eonn loil boyvf lifn dnioiiap oal naonliapf 7odn yliffiap oipeoien on fono on ie yicll naoff oal egen liobiliyollg pleofiapBoie iayonaooiia if bellipeneao feon, Si oennible don iin offeonoaye oioo SfioW don finyel oi finepi linyifliaiap iifD bco oi yiken iin ida linyiffiocne ie ocnael cfia oie iaiffeanike oal doiliap Tillee oal lnike iif oi oie yiafiaen if oie yoff,' Tg ekeaiap 6ennoclo neycnel oaioien lipf oa ill icnvgf liap oal leoa oal pocaof dioi o booole6nyonnel foye oal o niaple ege diiyi floniel o donaiap if fnidenn oioo yiffoalel nenfeyo, 'e don yollel Sillevnf diiyi feoan oie Fapng 7ae,' ?ive Fokef ie onvel aioiiapf poke aioiiapf eWfeyoel aioiiap? oal diea ie fonyiel nlidlg oal lelibenooelg iaoi oiein filnof ekea SfioW lefo iif oliae, ie iol iae feyclion...