Помощь в написании студенческих работ
Антистрессовый сервис

Блочный шифр ТЕА

Лабораторная работаПомощь в написанииУзнать стоимостьмоей работы

Void __fastcall TForm1: Button8Click (TObject *Sender). Void __fastcall TForm1: Button2Click (TObject *Sender). Void __fastcall TForm1: Button1Click (TObject *Sender). Результат работы программы. На тему: «Блочный шифр ТЕА». Memo1→Lines→LoadFromFile (OpenDialog1→FileName); __fastcall TForm1: TForm1(TComponent* Owner). AnsiString sloj (AnsiString A, AnsiString B). AnsiString xor (AnsiString A… Читать ещё >

Блочный шифр ТЕА (реферат, курсовая, диплом, контрольная)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ТИХООКЕАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Лабораторная работа №3

по дисциплине: Методы и средства защиты информации

на тему: «Блочный шифр ТЕА»

Выполнил:

студент гр. ВМ-91

Анисимов А.В.

Проверил: Сай С.В.

Хабаровск, 2013 г.

Цель: произвести кодирование текстового файла при помощи блочного алгоритма шифрования ТЕА.

Ход работы:

ТЕА (Tiny Encryption Algorithm) — блочный алгоритм шифрования типа «Сеть Фейштеля». Он основан на битовых операциях с 64-битным блоком, имеет 128-битный ключ шифрования. Стандартное количество раундов сети Фейштеля равно 64 (32 цикла).

Суть заключается в том, что исходный текст разбивается на блоки по 64 бита каждый. 128-битный ключ К делится на четыре 32-битных подключа K0, K1, K2 и K3. На этом подготовительный процесс заканчивается, после чего каждый 64-битный блок шифруется на протяжении 32 циклов (64 раундов) по нижеприведённому алгоритму.

Листинг программы:

#include

#include

#include

#pragma hdrstop

#include «Unit1.h»

#pragma package (smart_init)

#pragma resource «*.dfm»

AnsiStringsp ();

AnsiStringsl ();

AnsiStringDv ();

AnsiStringslj32(char A, char B);

AnsiStringsloj (AnsiStringA, AnsiString B);

AnsiStringxor ();

int Des ();

TForm1 *Form1;

AnsiStrings, m;

int Key =256;

AnsiString key="1 010 101 010 101 010 088 398 992 441 344″ ;//key

AnsiString Delta ="10 011 110 001 101 110 163 890 107 318 272″ ;

AnsiStringvch (char A, char B);

//—————————————————————————————————————;

__fastcall TForm1: TForm1(TComponent* Owner)

: TForm (Owner)

{

}

AnsiStringvch (char A, char B)

{

if (A=='1')

if (B=='1')

return («0»);

else return («1»);

else

if (B=='1')

return («-1»);

else return («0»);

}

AnsiString vj (AnsiString A, AnsiString B)

{

AnsiString res ="0″ ;

char p='0';

for (int i=A.Length ();i>=1;i—)

{

if (p=='0')

{

if (slj32(A[i], B[i])=="2″)

{

res[i]='0';

p='1';

}

else

if (slj32(A[i], B[i])=="1″)

{

res[i]='1';

p='0';

}

else

res[i]='0';

}

else

{

if (slj32(A[i], B[i])=="2″)

{

res[i]='1';

p='1';

}

else

if (slj32(A[i], B[i])=="1″)

{

res[i]='0';

p='1';

}

else

{

res[i]='1';

p='0';

}

}

}

return (res);

}

AnsiString xor (AnsiString A, AnsiString B)

{

AnsiString res="0″ ;

if (A≠B)

res=sloj (A, B);

return (res);

}

AnsiString slj32(char A, char B)

{

if (A==B=='1')

return («2»);else

if (A≠B)

return («1»);else

return («0»);

}

AnsiString sloj (AnsiString A, AnsiString B)

{

AnsiString res ="0″ ;

char p='0';

for (int i=A.Length ();i>=1;i—)

{

if (p=='0')

{

if (slj32(A[i], B[i])=="2″)

{

res[i]='0';

p='1';

}

else

if (slj32(A[i], B[i])=="1″)

{

res[i]='1';

p='0';

}

else

res[i]='0';

}

else

{

if (slj32(A[i], B[i])=="2″)

{

res[i]='1';

p='1';

}

else

if (slj32(A[i], B[i])=="1″)

{

res[i]='0';

p='1';

}

else

{

res[i]='1';

p='0';

}

}

}

return (res);

}

AnsiString sp (AnsiString S, int n)

{

AnsiString p;

for (int c=1;c<=n;c++)

{

for (int i=S.Length ()-1;i>=1;i—)

S[i+1]=S[i];

S[1]='0';

}

return (S);

}

AnsiString sl (AnsiString S, int n)

{

AnsiString p;

for (int c=1;c<=n;c++)

{

for (int i=1;i<=S.Length ()-1;i++)

S[i]=S[i+1];

S[S.Length ()]='0';

}return (S);

}

AnsiString Dv (char c)

{AnsiString l="" ;

int k=c;

if (k<0)

k=k+256;

while (k>1)

{

l=IntToStr (k % 2)+l;

k=k/2;

}

if (k==0)

l="0″ ;

else

l="1″ +l;

while (l.Length ()≠8)

l="0″ +l;

return (l);

}

int Des (AnsiString k)

{

int c=0;

for (int i=1;i<=8;i++)

c=c+StrToInt (k[i])*pow (2,k.Length ()-i);

return (c);

}

void __fastcall TForm1: Button1Click (TObject *Sender)

{

if (OpenDialog1->Execute ())

Memo1->Lines->LoadFromFile (OpenDialog1->FileName);

}

/////////////////////Кодирование//////////////////////////////////////////////

void __fastcall TForm1: Button8Click (TObject *Sender)

{

s=Memo1->Text;

for (int i =1;i<=s.Length ();i++)

{

m=m+Dv (s[i]);

}

AnsiString M;

AnsiString l;

for (int i =1;i<=s.Length ();i++)

{

M=M+Dv (s[i]);

}

int kol=M.Length ()/64;

int ost;

if (M.Length ()≠kol*64)

ost=(kol+1)*64-M.Length ();

else

ost=0;

if (ost>0)

for (int i=1;i<=ost;i++)

M=M+" 1″ ;

AnsiString v1, v0;

for (int i=0;i<=M.Length ()/64;i+=2)

{

AnsiString sum="0″ ;

v0=M.SubString (32*i+1,32);

v1=M.SubString (32*i+33,32);

for (int j=0;j<32;j++)

{

sum=sloj (sum, Delta);

AnsiString p=sl (v1,4);//v1<<4

p=sloj (p, key);//(v1<<4) + k0

AnsiString p1=sloj (v1,sum);//v1+sum

p=xor (p, p1);//((v1<<4) + k0))^(v1+sum)

AnsiString p2=sp (v1,5);//v1>>5

AnsiString p3=sloj (p2,key);//v1>>5+k1

AnsiString p4=xor (p, p3);//all

v0=sloj (v0,p4);//+=

p=sl (v0,4);//v0<<4

p1=sloj (p, key);//v0<<4+k2

p=sloj (v0,sum);//v0+sum

p=xor (p, p1);//(v0<<4+k2)^(v0+sum)

p2=(sp (v0,5));//v0>>5;

p3=sloj (p2,key);//v0>>5+k1;

p4=xor (p, p3);// ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3)

v1=sloj (v1,p4);//+=

}

Memo2->Text=Memo2->Text+v0+v1;

}

AnsiString re=Memo2->Text;

AnsiString q="" ;

Memo2->Clear ();

for (int i=1;i<=re.Length ();i+=8)

{

q="" ;

for (int j=i;j<=i+7;j++)

q=q+re[j];

Memo2->Text=Memo2->Text+char (Des (q));

}

}

void __fastcall TForm1: Button10Click (TObject *Sender)

{

ShowMessage (0xC6EF3720);

}

//////////Декодирование//////////////////////////////////////////

void __fastcall TForm1: Button2Click (TObject *Sender)

{

s=Memo1->Text;

for (int i =1;i<=s.Length ();i++)

{

m=m+Dv (s[i]);

}

AnsiString M;

AnsiString l;

for (int i =1;i<=s.Length ();i++)

{

M=M+Dv (s[i]);

}

int kol=M.Length ()/64;

int ost;

if (M.Length ()≠kol*64)

ost=(kol+1)*64-M.Length ();

else

ost=0;

if (ost>0)

for (int i=1;i<=ost;i++)

M=M+" 1″ ;

AnsiString v1, v0;

for (int i=0;i<=M.Length ()/64;i+=2)

{

AnsiString sum="0″ ;

v0=M.SubString (32*i+1,32);

v1=M.SubString (32*i+33,32);

for (int j=0;j<32;j++)

{

sum=sloj (sum, Delta);

AnsiString p=sl (v1,4);//v1<<4

p=sloj (p, key);//(v1<<4) + k0

AnsiString p1=sloj (v1,sum);//v1+sum

p=xor (p, p1);//((v1<<4) + k0))^(v1+sum)

AnsiString p2=sp (v1,5);//v1>>5

AnsiString p3=sloj (p2,key);//v1>>5+k1

AnsiString p4=xor (p, p3);//all

v0=sloj (v0,p4);//+=

p=sl (v0,4);//v0<<4

p1=sloj (p, key);//v0<<4+k2

p=sloj (v0,sum);//v0+sum

p=xor (p, p1);//(v0<<4+k2)^(v0+sum)

p2=(sp (v0,5));//v0>>5;

p3=sloj (p2,key);//v0>>5+k1;

p4=xor (p, p3);// ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3)

v1=sloj (v1,p4);//+=

}

Memo2->Text=Memo2->Text+v0+v1;

}

AnsiString re=Memo2->Text;

AnsiString q="" ;

Memo2->Clear ();

for (int i=1;i<=re.Length ();i+=8)

{

q="" ;

for (int j=i;j<=i+7;j++)

q=q+re[j];

Memo2->Text=Memo1->Text+char (Des (q));

}

}

блочный шифр кодирование алгоритм

Результат работы программы

Кодирование

Декодирование

Вывод: в данной работе было произведено кодирование текста при помощи блочного алгоритма шифрования ТЕА.

Показать весь текст
Заполнить форму текущей работой