Реализация криптографического алгоритма (AES) Rijndael
Шифрование как способ преобразования открытой информации в закрытую и обратно, его основные этапы и назначение, сферы практического применения и оценка преимуществ. История AES, его описание и вспомогательные процедуры, а также программная реализация.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.04.2012 |
Размер файла | 994,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
xor ((W3 shl 24) or (W3 shr 8))) xor Key[31];
// раунд 4
W0:= InverseTable [Byte(T1 [0])]; W1:= InverseTable [Byte(T1 [3] shr 8)];
W2:= InverseTable [Byte(T1 [2] shr 16)]; W3:= InverseTable [Byte(T1 [1] shr 24)];
T0 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[24];
W0:= InverseTable [Byte(T1 [1])]; W1:= InverseTable [Byte(T1 [0] shr 8)];
W2:= InverseTable [Byte(T1 [3] shr 16)]; W3:= InverseTable [Byte(T1 [2] shr 24)];
T0 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[25];
W0:= InverseTable [Byte(T1 [2])]; W1:= InverseTable [Byte(T1 [1] shr 8)];
W2:= InverseTable [Byte(T1 [0] shr 16)]; W3:= InverseTable [Byte(T1 [3] shr 24)];
T0 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[26];
W0:= InverseTable [Byte(T1 [3])]; W1:= InverseTable [Byte(T1 [2] shr 8)];
W2:= InverseTable [Byte(T1 [1] shr 16)]; W3:= InverseTable [Byte(T1 [0] shr 24)];
T0 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[27];
// раунд 5
W0:= InverseTable [Byte(T0 [0])]; W1:= InverseTable [Byte(T0 [3] shr 8)];
W2:= InverseTable [Byte(T0 [2] shr 16)]; W3:= InverseTable [Byte(T0 [1] shr 24)];
T1 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[20];
W0:= InverseTable [Byte(T0 [1])]; W1:= InverseTable [Byte(T0 [0] shr 8)];
W2:= InverseTable [Byte(T0 [3] shr 16)]; W3:= InverseTable [Byte(T0 [2] shr 24)];
T1 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[21];
W0:= InverseTable [Byte(T0 [2])]; W1:= InverseTable [Byte(T0 [1] shr 8)];
W2:= InverseTable [Byte(T0 [0] shr 16)]; W3:= InverseTable [Byte(T0 [3] shr 24)];
T1 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[22];
W0:= InverseTable [Byte(T0 [3])]; W1:= InverseTable [Byte(T0 [2] shr 8)];
W2:= InverseTable [Byte(T0 [1] shr 16)]; W3:= InverseTable [Byte(T0 [0] shr 24)];
T1 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[23];
// раунд 6
W0:= InverseTable [Byte(T1 [0])]; W1:= InverseTable [Byte(T1 [3] shr 8)];
W2:= InverseTable [Byte(T1 [2] shr 16)]; W3:= InverseTable [Byte(T1 [1] shr 24)];
T0 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[16];
W0:= InverseTable [Byte(T1 [1])]; W1:= InverseTable [Byte(T1 [0] shr 8)];
W2:= InverseTable [Byte(T1 [3] shr 16)]; W3:= InverseTable [Byte(T1 [2] shr 24)];
T0 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[17];
W0:= InverseTable [Byte(T1 [2])]; W1:= InverseTable [Byte(T1 [1] shr 8)];
W2:= InverseTable [Byte(T1 [0] shr 16)]; W3:= InverseTable [Byte(T1 [3] shr 24)];
T0 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[18];
W0:= InverseTable [Byte(T1 [3])]; W1:= InverseTable [Byte(T1 [2] shr 8)];
W2:= InverseTable [Byte(T1 [1] shr 16)]; W3:= InverseTable [Byte(T1 [0] shr 24)];
T0 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[19];
// раунд 7
W0:= InverseTable [Byte(T0 [0])]; W1:= InverseTable [Byte(T0 [3] shr 8)];
W2:= InverseTable [Byte(T0 [2] shr 16)]; W3:= InverseTable [Byte(T0 [1] shr 24)];
T1 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[12];
W0:= InverseTable [Byte(T0 [1])]; W1:= InverseTable [Byte(T0 [0] shr 8)];
W2:= InverseTable [Byte(T0 [3] shr 16)]; W3:= InverseTable [Byte(T0 [2] shr 24)];
T1 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[13];
W0:= InverseTable [Byte(T0 [2])]; W1:= InverseTable [Byte(T0 [1] shr 8)];
W2:= InverseTable [Byte(T0 [0] shr 16)]; W3:= InverseTable [Byte(T0 [3] shr 24)];
T1 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[14];
W0:= InverseTable [Byte(T0 [3])]; W1:= InverseTable [Byte(T0 [2] shr 8)];
W2:= InverseTable [Byte(T0 [1] shr 16)]; W3:= InverseTable [Byte(T0 [0] shr 24)];
T1 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[15];
// раунд 8
W0:= InverseTable [Byte(T1 [0])]; W1:= InverseTable [Byte(T1 [3] shr 8)];
W2:= InverseTable [Byte(T1 [2] shr 16)]; W3:= InverseTable [Byte(T1 [1] shr 24)];
T0 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[8];
W0:= InverseTable [Byte(T1 [1])]; W1:= InverseTable [Byte(T1 [0] shr 8)];
W2:= InverseTable [Byte(T1 [3] shr 16)]; W3:= InverseTable [Byte(T1 [2] shr 24)];
T0 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[9];
W0:= InverseTable [Byte(T1 [2])]; W1:= InverseTable [Byte(T1 [1] shr 8)];
W2:= InverseTable [Byte(T1 [0] shr 16)]; W3:= InverseTable [Byte(T1 [3] shr 24)];
T0 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[10];
W0:= InverseTable [Byte(T1 [3])]; W1:= InverseTable [Byte(T1 [2] shr 8)];
W2:= InverseTable [Byte(T1 [1] shr 16)]; W3:= InverseTable [Byte(T1 [0] shr 24)];
T0 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[11];
// раунд 9
W0:= InverseTable [Byte(T0 [0])]; W1:= InverseTable [Byte(T0 [3] shr 8)];
W2:= InverseTable [Byte(T0 [2] shr 16)]; W3:= InverseTable [Byte(T0 [1] shr 24)];
T1 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[4];
W0:= InverseTable [Byte(T0 [1])]; W1:= InverseTable [Byte(T0 [0] shr 8)];
W2:= InverseTable [Byte(T0 [3] shr 16)]; W3:= InverseTable [Byte(T0 [2] shr 24)];
T1 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[5];
W0:= InverseTable [Byte(T0 [2])]; W1:= InverseTable [Byte(T0 [1] shr 8)];
W2:= InverseTable [Byte(T0 [0] shr 16)]; W3:= InverseTable [Byte(T0 [3] shr 24)];
T1 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[6];
W0:= InverseTable [Byte(T0 [3])]; W1:= InverseTable [Byte(T0 [2] shr 8)];
W2:= InverseTable [Byte(T0 [1] shr 16)]; W3:= InverseTable [Byte(T0 [0] shr 24)];
T1 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[7];
// Последнийраундпреобразований
W0:= LastInverseTable [Byte(T1 [0])]; W1:= LastInverseTable [Byte(T1 [3] shr 8)];
W2:= LastInverseTable [Byte(T1 [2] shr 16)]; W3:= LastInverseTable [Byte(T1 [1] shr 24)];
T0 [0]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[0];
W0:= LastInverseTable [Byte(T1 [1])]; W1:= LastInverseTable [Byte(T1 [0] shr 8)];
W2:= LastInverseTable [Byte(T1 [3] shr 16)]; W3:= LastInverseTable [Byte(T1 [2] shr 24)];
T0 [1]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[1];
W0:= LastInverseTable [Byte(T1 [2])]; W1:= LastInverseTable [Byte(T1 [1] shr 8)];
W2:= LastInverseTable [Byte(T1 [0] shr 16)]; W3:= LastInverseTable [Byte(T1 [3] shr 24)];
T0 [2]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[2];
W0:= LastInverseTable [Byte(T1 [3])]; W1:= LastInverseTable [Byte(T1 [2] shr 8)];
W2:= LastInverseTable [Byte(T1 [1] shr 16)]; W3:= LastInverseTable [Byte(T1 [0] shr 24)];
T0 [3]:= (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[3];
// Конечное преобразование
PLongWord (@OutBuf[0])^:= T0 [0]; PLongWord (@OutBuf[4])^:= T0 [1];
PLongWord (@OutBuf[8])^:= T0 [2]; PLongWord (@OutBuf[12])^:= T0 [3];
end;
// Сначала ключ переводится к расширенному
procedure EncryptAESStreamECB (Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream);
var
ExpandedKey: TAESExpandedKey128;
begin
ExpandAESKeyForEncryption (Key, ExpandedKey);
// Вызов из этой процедуры процедуры шифорования с расширенным ключом
EncryptAESStreamECB (Source, Count, ExpandedKey, Dest);
end;
// Шифрованиепотока
procedure EncryptAESStreamECB (Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream);
var
TempIn, TempOut: TAESBuffer; // Размер буферов считывания и записи
Done: cardinal;
st: TStringStream;
tick: integer;
begin
st:= TStringStream. Create('');
if Count = 0 then
begin
Source. Position:= 0; // Указательвначалопотока
Count:= Source. Size; // Определение текущего размера потока
end
else Count:= Min (Count, Source. Size - Source. Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source. Read (TempIn, SizeOf(TempIn)); // Считываемданныеизпотока
if Done < SizeOf(TempIn) then
raise EStreamError. Create(SReadError);
EncryptAES (TempIn, ExpandedKey, TempOut);
if flag = false then
begin
// Вывод входного и выходного блоков
FmStop. EditIn. Text:= IntToHex (TempIn[0], 2)+IntToHex (TempIn[1], 2)+
IntToHex (TempIn[2], 2)+IntToHex (TempIn[3], 2)+IntToHex (TempIn[4], 2)+
IntToHex (TempIn[5], 2)+IntToHex (TempIn[6], 2)+IntToHex (TempIn[7], 2)+
IntToHex (TempIn[8], 2)+IntToHex (TempIn[9], 2)+IntToHex (TempIn[10], 2)+
IntToHex (TempIn[11], 2)+IntToHex (TempIn[12], 2)+IntToHex (TempIn[13], 2)+
IntToHex (TempIn[14], 2)+IntToHex (TempIn[15], 2);
FmStop. EditOut. Text:= IntToHex (TempOut[0], 2)+IntToHex (TempOut[1], 2)+
IntToHex (TempOut[2], 2)+IntToHex (TempOut[3], 2)+IntToHex (TempOut[4], 2)+
IntToHex (TempOut[5], 2)+IntToHex (TempOut[6], 2)+IntToHex (TempOut[7], 2)+
IntToHex (TempOut[8], 2)+IntToHex (TempOut[9], 2)+IntToHex (TempOut[10], 2)+
IntToHex (TempOut[11], 2)+IntToHex (TempOut[12], 2)+IntToHex (TempOut[13], 2)+
IntToHex (TempOut[14], 2)+IntToHex (TempOut[15], 2);
//FmStop
end;
Done:= Dest. Write (TempOut, SizeOf(TempOut));
st. Write (TempOut, SizeOf(TempOut));
Form1. MemoOut. Text:= st. DataString;
if Form1. RadioGroup1. ItemIndex = 1 then
begin
tick:= GetTickCount;
repeat
Application. ProcessMessages;
until (GetTickCount-tick)>StrToInt (Form1.editDelay. Text);
end;
if Done < SizeOf(TempOut) then
raise EStreamError. Create(SWriteError);
Dec (Count, SizeOf(TAESBuffer));
end; //while
if Count > 0 then
begin
Done:= Source. Read (TempIn, Count);
if Done < Count then
raise EStreamError. Create(SReadError);
FillChar (TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES (TempIn, ExpandedKey, TempOut);
if flag = false then
begin
// Вывод входного и выходного блоков
FmStop. EditIn. Text:= IntToHex (TempIn[0], 2)+IntToHex (TempIn[1], 2)+
IntToHex (TempIn[2], 2)+IntToHex (TempIn[3], 2)+IntToHex (TempIn[4], 2)+
IntToHex (TempIn[5], 2)+IntToHex (TempIn[6], 2)+IntToHex (TempIn[7], 2)+
IntToHex (TempIn[8], 2)+IntToHex (TempIn[9], 2)+IntToHex (TempIn[10], 2)+
IntToHex (TempIn[11], 2)+IntToHex (TempIn[12], 2)+IntToHex (TempIn[13], 2)+
IntToHex (TempIn[14], 2)+IntToHex (TempIn[15], 2);
FmStop. EditOut. Text:= IntToHex (TempOut[0], 2)+IntToHex (TempOut[1], 2)+
IntToHex (TempOut[2], 2)+IntToHex (TempOut[3], 2)+IntToHex (TempOut[4], 2)+
IntToHex (TempOut[5], 2)+IntToHex (TempOut[6], 2)+IntToHex (TempOut[7], 2)+
IntToHex (TempOut[8], 2)+IntToHex (TempOut[9], 2)+IntToHex (TempOut[10], 2)+
IntToHex (TempOut[11], 2)+IntToHex (TempOut[12], 2)+IntToHex (TempOut[13], 2)+
IntToHex (TempOut[14], 2)+IntToHex (TempOut[15], 2);
//FmStop
end;
Done:= Dest. Write (TempOut, SizeOf(TempOut));
st. Write (TempOut, SizeOf(TempOut));
Form1. MemoOut. Text:= st. DataString;
if Form1. RadioGroup1. ItemIndex = 0 then
begin
tick:= GetTickCount;
repeat
Application. ProcessMessages;
until (GetTickCount-tick)>StrToInt (Form1.editDelay. Text);
end;
if Done < SizeOf(TempOut) then
raise EStreamError. Create(SWriteError);
end;
st. Free;
Form1. Label_Status. Caption:= 'Шифрованиезавершено';
end;
// Дешифрование
procedure DecryptAESStreamECB (Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream);
var
ExpandedKey: TAESExpandedKey128;
begin
ExpandAESKeyForDecryption (Key, ExpandedKey);
// Расширениеключадлядешифрования
DecryptAESStreamECB (Source, Count, ExpandedKey, Dest);
// Дешифрование
end;
procedure DecryptAESStreamECB (Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream);
var
tick: integer;
TempIn, TempOut: TAESBuffer;
Done: cardinal;
stt: TStringStream;
begin
stt:= TStringStream. Create('');
if Count = 0 then
begin
Source. Position:= 0;
Count:= Source. Size;
end
else Count:= Min (Count, Source. Size - Source. Position);
if Count = 0 then exit;
if (Count mod SizeOf(TAESBuffer)) > 0 then
raise EAESError. Create(SInvalidInBufSize);
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source. Read (TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError. Create(SReadError);
DecryptAES (TempIn, ExpandedKey, TempOut);
if flag = false then
begin
// Вывод входного и выходного блоков
FmStop. EditIn. Text:= IntToHex (TempIn[0], 2)+IntToHex (TempIn[1], 2)+
IntToHex (TempIn[2], 2)+IntToHex (TempIn[3], 2)+IntToHex (TempIn[4], 2)+
IntToHex (TempIn[5], 2)+IntToHex (TempIn[6], 2)+IntToHex (TempIn[7], 2)+
IntToHex (TempIn[8], 2)+IntToHex (TempIn[9], 2)+IntToHex (TempIn[10], 2)+
IntToHex (TempIn[11], 2)+IntToHex (TempIn[12], 2)+IntToHex (TempIn[13], 2)+
IntToHex (TempIn[14], 2)+IntToHex (TempIn[15], 2);
FmStop. EditOut. Text:= IntToHex (TempOut[0], 2)+IntToHex (TempOut[1], 2)+
IntToHex (TempOut[2], 2)+IntToHex (TempOut[3], 2)+IntToHex (TempOut[4], 2)+
IntToHex (TempOut[5], 2)+IntToHex (TempOut[6], 2)+IntToHex (TempOut[7], 2)+
IntToHex (TempOut[8], 2)+IntToHex (TempOut[9], 2)+IntToHex (TempOut[10], 2)+
IntToHex (TempOut[11], 2)+IntToHex (TempOut[12], 2)+IntToHex (TempOut[13], 2)+
IntToHex (TempOut[14], 2)+IntToHex (TempOut[15], 2);
//FmStop
end;
stt. Write (TempOut, SizeOf(TempOut));
Form1. MemoOut. Text:= stt. DataString;
if Form1. RadioGroup1. ItemIndex = 1 then
begin
tick:= GetTickCount;
repeat
Application. ProcessMessages;
until (GetTickCount-tick)>StrToInt (Form1.editDelay. Text);
end;
Done:= Dest. Write (TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError. Create(SWriteError);
Dec (Count, SizeOf(TAESBuffer));
end;
stt. Free;
Form1. Label_Status. Caption:= 'Дешифрованиезавершено';
end;
procedure TForm1. Button1Click (Sender: TObject);
var stpath, stext: string;
begin
if OpenDialog1. Execute = True then
begin
Edit1. Text:= OpenDialog1. FileName;
MemoIn. Lines. LoadFromFile (Edit1.text);
Fpath:= Edit1. Text;
stpath:= ExtractFileDir(Fpath);
stExt:= ExtractFileExt(FPath);
If CBOpt. Text = «Шифрование» then
begin
LName. Caption:= 'Имязашифрованогофайла:';
Fpath:= stpath + '\EncodedFile'+stExt;
LPath. Caption:= FPath;
end
else
begin
LName. Caption:= 'Имядешифрованогофайла:';
Fpath:= stpath + '\DecodedFile'+stExt;
LPath. Caption:= FPath;
end;
end;
end;
procedure TForm1. Button2Click (Sender: TObject);
var
Source, Dest: TFileStream;
SrcFile, DestFile: string;
Start, Stop: cardinal;
Size: integer;
Key: TAESKey128; // Длина ключа и блока 128 бит
SrcBuf, DstBuf: array [0..16383] of byte;
SrcSize, DstSize: integer;
begin
If Edit1. Text = '' then exit;
// Шифрование
if CBOpt. Text = «Шифрование» then
begin
Label_Status. Caption:= 'Шифрование…';
Refresh;
Source:= TFileStream. Create (Edit1. Text, fmOpenRead); // Открываемфайлдлячтения
try
Label4. Caption:= IntToStr (Source. Size div 1024) + ' KB'; // Выводразмерафайла
Refresh;
DestFile:= Fpath; // Файлназначения
Dest:= TFileStream. Create (DestFile, fmCreate); // Создаемновыйфайлилипереписываемужеимеющийся
try
Size:= Source. Size; // Определение размера источника
Dest. WriteBuffer (Size, SizeOf(Size)); // Задаем размер буфера назначения
FillChar (Key, SizeOf(Key), 0); // Заполняемключнулями
Move (PChar(Edit2. Text)^, Key, Min (SizeOf(Key), Length (Edit2. Text))); // Вначалоключазаписываемпароль
Start:= GetTickCount;
EncryptAESStreamECB (Source, 0, Key, Dest);
Stop:= GetTickCount;
Label_Time. Caption:= IntToStr (Stop - Start) + ' ms';
Refresh;
finally
Dest. Free;
end;
finally
Source. Free;
end;
end;
if CBOpt. Text = «Дешифрование» then
begin
// Дешифрование
Label_Status. Caption:= 'Дешифрование…';
Refresh;
Source:= TFileStream. Create (Edit1. Text, fmOpenRead); // Источник - зашифрованныйфайл
try
Source. ReadBuffer (Size, SizeOf(Size)); // Считывание Size данныхизпотока
SrcFile:= fpath;
FillChar (Key, SizeOf(Key), 0); // Заполняемключнулями
Move (PChar(Edit2. Text)^, Key, Min (SizeOf(Key), Length (Edit2. Text))); // Вначалоключазаписываемпароль
DestFile:= Fpath;
Dest:= TFileStream. Create (DestFile, fmCreate); // Назначение
try
Start:= GetTickCount;
DecryptAESStreamECB (Source, Source. Size - Source. Position, Key, Dest);
Dest. Size:= Size;
Stop:= GetTickCount;
Label_Time. Caption:= IntToStr (Stop - Start) + ' ms';
Refresh;
finally
Dest. Free;
end;
finally
Source. Free;
end;
end;
end;
procedure TForm1. ButtonStopClick (Sender: TObject);
begin
flag:= true;
FmStop. ShowModal;
repeat
Application. ProcessMessages;
until not Flag;
end;
procedure TForm1.CBOptChange (Sender: TObject);
begin
If CBOpt. Text = «Шифрование» then
begin
Button2. Caption:= 'Шифровать';
LName. Caption:= 'Имязашифрованногофайла';
end
else
begin
Button2. Caption:= 'Дешифровать';
LName. Caption:= 'Имя Дешифрованного файла';
end;
end;
procedure TForm1. FormActivate (Sender: TObject);
begin
flag:= false;
end;
procedure TForm1. RadioGroup1Click (Sender: TObject);
begin
If RadioGroup1. ItemIndex = 0 then EditDelay. Enabled:= false else
EditDelay. Enabled:= true;
end;
procedure TForm1.MFExitClick (Sender: TObject);
begin
Close;
end;
procedure TForm1.MFChooseClick (Sender: TObject);
begin
Button1. Click;
end;
procedure TForm1. FormCreate (Sender: TObject);
begin
Application. HelpFile:= GetCurrentDir +'\AES.hlp';
end;
procedure TForm1.MHHelpClick (Sender: TObject);
begin
Application. HelpCommand (HELP_CONTENTS, 1);
end;
end.
Заключение
Среди способов защиты информации наиболее важным считается криптографический. Он предусматривает такое преобразование информации, при котором она становится доступной для прочтения лишь обладателю некоторого секретного параметра (ключа). В последние годы область применения криптографии значительно расширилась. Ее стали повседневно использовать многие организации, коммерческие фирмы, частные лица, СМИ.
В данной курсовой работе изучается алгоритм шифрования данных AES: его история создания, описание и программная реализация.
Список использованной литературы
1. Религии мира. Справочник. - Пер. с англ.: М.: Белфаксиздатгрупп, 1994.
2. Панасенко С.П. Алгоритмы шифрования. Специальный справочник. - СПб.: БХВ-Петербург, 2009.
3. Технические средства и методы защиты информации. Учебное пособие для вузов /А.П. Зайцев, А.А. Шелупанов, Р.В. Мещеряков и др.; под ред. А.П. Зайцева и А.А. Шелупанова. - 4-е изд., испр. И доп. - М., 2009.
4. Прикладная криптография. Брюс Шнайер, 2-е издание
Размещено на Allbest.ru
Подобные документы
Разработка криптографического алгоритма программы ручного шифра по таблице Виженера. Разработка программы, выполняющей шифрование и расшифрование. Особенности использования в качестве ключа самого открытого текста. Алгоритмы решения "обратных" задач.
курсовая работа [45,0 K], добавлен 13.11.2009История возникновения алгоритма симметричного шифрования, условия и особенности его применения на современном этапе. Принципы и функции исследуемой технологии. Анализ главных преимуществ и недостатков использования алгоритма, оценка его уязвимости.
курсовая работа [301,9 K], добавлен 29.10.2017Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.
курсовая работа [314,2 K], добавлен 27.01.2015Разработка приложения для шифрования данных с помощью алгоритма DES5: процесс шифрования, расшифрования, получение ключей. Спецификация программы, процедуры и функции; описание интерфейса пользователя. Реализация задачи в среде программирования DELPHI.
курсовая работа [812,6 K], добавлен 27.03.2012Теоретическое исследование вопроса и практическое применение. Общие сведения о графах. Алгоритм Дейкстры. Особенности работы в среде. Программная реализация. Описание алгоритма и структуры программы. Описание программных средств. Текст программы.
курсовая работа [1,0 M], добавлен 27.11.2007Принцип работы и программная реализация однозвучного, одноалфавитного и полиграммного шифра. Шифрование по методу подстановки, замены и кодового слова. Безопасность шифровки простой замены. Частотные характеристики текстовых сообщений и дешифрация.
контрольная работа [1,1 M], добавлен 02.02.2012Методы криптографической защиты информации в России в XIX веке. Описание структуры программы: библиотека DLL, графическая оболочка, консольная реализация. Вид функции шифрования. Инструкция системного программиста. Класс для шифровки, расшифровки данных.
контрольная работа [26,3 K], добавлен 22.12.2011Получение вейвлетов Габора из представления путем его поворота и растяжения для известного числа масштабов и ориентаций. Описание процедуры pullback. Детектор края, реализация алгоритма. Генерация представления изображения с помощью вейвлетов Габора.
курсовая работа [1021,4 K], добавлен 29.10.2017Симметрическое шифрование как способ шифрования, в котором применяется один и тот же криптографический ключ. Функции стандартного диалогового окна открытия и сохранения файла. Характерная схема действий при генерации подписи. Цифровая подпись файла.
курсовая работа [641,5 K], добавлен 14.06.2011Особенности метода неопределенных множителей Лагранжа, градиентного метода и метода перебора и динамического программирования. Конструирование алгоритма решения задачи. Структурная схема алгоритма сценария диалога и описание его программной реализации.
курсовая работа [1010,4 K], добавлен 10.08.2014