Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторна робота №10

.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
69.63 Кб
Скачать

Практична робота № 10

Тема: Програмна реалізація шифрів складної заміни. Розкриття шифру Віженера

Мета: Навчитися виконувати розкриття шифру Віженера.

Теоретичні відомості

Для того, щоб зламати шифр Цезаря, були необхідні частоти букв. Для злому шифру Віженера потрібно знати або частоту комбінацій букв (включаючи пропуск), що йдуть підряд, або хоча б  частоту біграм (комбінації з двох букв, що підряд йдуть), або, як мінімум, класифікацію біграм на допустимі в язиці, на якому написано повідомлення, і на неприпустимі.

Проаналізуємо криптосистему виходячи з допущення, що алфавіт системи складається з пропуску і символів латинського алфавіту.

Алгоритм злому шифру Віженера наступний. Задамося завдовжки ключа – kl. Потім почнемо перебір всіх 27 х 27 = 729 біграм як перші букви ключа. Ця біграма підставляється під першу і другу букви криптограми, під (kl+1) -у і (kl+2) -у, і взагалі під (M*kl+1) -у і (M*kl+2) букви для M=0,1,2..., до тих пір, поки вистачить криптограми. Проводиться розшифровка відповідних місць повідомлення. Якщо правильно вгадані довжина ключа і перші дві букви ключа, то будуть правильно розшифровані m + 1 пар, і всі ці пари будуть допустимими біграмами, тобто в Таблиці 2 їм відповідатимуть одиниці. Інакше (якщо неправильно вгадана довжина ключа або пари букв з нього) розшифровуються не m + 1 пар з початкового тексту, а m + 1 випадкових пар.

Для скорочення перебору, після того, як вгадана довжина ключа, склад ключа знаходиться перебором складових його біграм, тобто для визначення 1-й і 2-й букви перебираються все біграми, для визначення 2-й і 3-й букв перебираються всі біграми, що починаються на 2-у букву вже пройшли перевірку перших біграм і т.д.

WE CHOSE WORD QUOTE SMILES UNQUOTE AS KEY SINCE IT IS LONGEST IN ENGLISH LANGUAGE BECAUSE THERE IS А MILE BETWEEN FIRST AND LAST LETTERS THIS WORD PERIOD

Ми вибрали слово smiles як ключ, оскільки воно – найдовше слово в англійській мові оскільки першу і останню букву цього слова розділяє mile – миля.

Це повідомлення було зашифровано ключем smiles, внаслідок чого вийшла криптограма:

ORIOMGKRIEMXSIXCISIGXEJSKZRXJKSGWBZGLRIMXSLUNLP_XQMAUSVXMREEAKMBTJSDAWSJKLMEWLY_XMNZLDAEQLQTFTCMLXSON_OFMKRIEMXJRIUXSTMVUQXSON_EAXX_IEMXSSRCXLSNWPEL_RIXFYLXDALTYSFQUXSOA_PEHXDR_I

До криптограми була застосована програма Crack_Vig з довжиною ключа 4, 5 і 6. По-перше двох випадках всі ключі були забраковані, а при kl = 6 пройшов єдиний ключ – smiles. Кінець прикладу.

Іноді перед вживанням шифру Віженера алфавіт один раз перемішують, такий шифр і метод його розшифровки розглянутий в книзі Уезерелла, 1982.

Програма Crack_Vig зламує шифр Віженера, якщо plaintext на англійській мові, а ciphertext використовує тільки заголовні букви і пропуск.

program Crack_Vig;

uses crt;

label fin, fin2;

const

mSize=500; {Максимальный размер сообщения}

kl=6; {Размер ключа}

CiD=10; {Число столбцов в D}

var

i,j,k,place,rid,s,size: integer;

c,cl,dl,c2,d2: char;

tab: array['@'..'Z','@'..'Z'] of real;

msg: array[1..mSize] of char;

d: array[1..2*(kl-1),1..ciD] of char;

key: array[1..kl] of char;

keyWrong: boolean;

f: text;

up,down: array['@'..'Z'] of Boolean;

procedure fitKey;

var ncl,nc2,ndl,nd2,nl,n2: integer;

begin

keyWrong:=false;

ndl:=ord(dl);

nd2:=ord(d2);

ncl:=ord(msg[place]);

nc2:=ord(msg[place+1]) ;

nl:=(ncl-ndl+27) mod 27;

nl:=nl+64;

n2:=(nc2-nd2+27) mod 27;

n2:=n2+64;

if tab[chr(nl),chr(n2)]=0

then keyWrong:=true;

end;

begin

for c:='@' to 'Z' do

begin

up[c]:=true;

down[c]:=false

end;

clrscr;

{Чистка D}

riD:=2*(kl-1); {rows in D}

for i:=1 to riD do

for j:=1 to ciD do

D[i,j]:=' ';

{Чистка key}

for i:=1 to kl do key[i]:=' ';

{Ввод tab}

assign(f,'tab.dig');

reset(f) ;

for cl:='@' to 'Z' do

for c2:='@' to 'Z'do

read(f, tab[cl,c2]);

close(f) ;

{Ввод ciphertext}

assign(f, 'shifr.txt');

reset(f) ;

i:=0;

while not eof(f) do

begin

inc (i) ;

read(f,msg[i]);

if msg[i]=' '

then msg[i]:='@' ;

end;

size :=i;

close (f) ;

{Начинается расшифровка}

for i:=1 to kl-1 do

begin {1}

s:=0;

for dl:='@' to 'Z' do

if up [dl] then

for d2:='@' to 'Z' do

begin {2}

place:=i;

while place<mSize do

begin {3}

FitKey;

if KeyWrong then goto fin2;

place:=place+kl;

end{3};

{bиграммa прошла проверку} inc (s) ;

down[d2]:=true;

if s>ciD then

begin

writeln('Overflow in D');

halt

end;

D[i,s]:=dl;

D[i+1,s]:=d2;

fin2:

end {2 } ;

up:=down;

for c:='@' to 'Z' do

down[c]:=false;

end{l};

{if D[.aD,l]=' I then

begin

writeln (' не тот размер ключа ') ;

goto fin

end; }

for i:=1 to RiD do

for j:=1 to CiD do

if D[i,j]<>' ' then writeln(D[i,j]);

fin:ReadKey;

end.

Виконання роботи

  1. Виконати розкриття тексту, використовуючи описаний алгоритм.

Контрольні питання

        1. Дайте визначення таких понять: алфавіт, текст, шифр, ключ, зашифрування, розшифрування, криптосистема, розкриття шифру, стійкість крипто алгоритму.

        2. У чому полягає відмінність процесів розшифрування та розкриття шифрів?

        3. Які шифри називають шифрами складної заміни?

        4. Сформулюйте алгоритм шифрування тексту за допомогою шифру Віженера.

        5. Сформулюйте алгоритм розкриття шифру Віженера.