Блочный шифр ТЕА
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));
}
}
блочный шифр кодирование алгоритм
Результат работы программы
Кодирование
Декодирование
Вывод: в данной работе было произведено кодирование текста при помощи блочного алгоритма шифрования ТЕА.