ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.06.2024
Просмотров: 9
Скачиваний: 0
Практична робота № 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.
Виконання роботи
-
Виконати розкриття тексту, використовуючи описаний алгоритм.
Контрольні питання
-
Дайте визначення таких понять: алфавіт, текст, шифр, ключ, зашифрування, розшифрування, криптосистема, розкриття шифру, стійкість крипто алгоритму.
-
У чому полягає відмінність процесів розшифрування та розкриття шифрів?
-
Які шифри називають шифрами складної заміни?
-
Сформулюйте алгоритм шифрування тексту за допомогою шифру Віженера.
-
Сформулюйте алгоритм розкриття шифру Віженера.