АгеевМА_КМЗИ
.pdf2.3Участие в конкурсе AES
Врезультате всестороннего анализа на первом этапе конкурса AES, причём исследовались не только криптографические свойства, такие как стойкость к известным атакам, отсутствие слабых ключей, хорошие статистические свойства, но и практические аспекты реализации: оптимизацию скорости выполнения кода на различных архитектурах (от ПК до смарт-карт и аппаратных реализаций), возможность оптимизации размера кода, возможность распараллеливания, были выявлены следующие достоинства и недостатки
CAST-256 шифра. [3]
Основными достоинствами являются:
отсутствие уязвимостей.
возможность быстрого выполнения расширения ключа, то есть в процессе операции кодирования, но не декодирования.
Валгоритме было найдено ряд недостатков, из-за которых он не вошел во второй раунд конкурса:
скорость шифрования алгоритма невысока по сравнению с рядом алгоритмов — участников конкурса, в том числе всех финалистов конкурса.
высокие требования к оперативной и энергозависимой памяти.
3.Программная реализация алгоритма
Врамках выполнения курсовой работы написано приложение, которое шифрует и расшифровывает файл по алгоритму CAST-128.
Программа использует библиотеки Cast128 и Tools. Для удобства демонстрации ключ генерируется автоматически. Длина ключа составляет 16
байт, размер блока файла 8 байт (256 и 128 бит соответственно).
На примере (рисунок 1) можно увидеть шифрование и дешифрование исходного файла «picture.png». Первоначально производится шифрование в файл «picture2.png», а далее дешифрование последнего в «picture3.png», который полностью идентичен исходному файлу.
Рисунок 1 – Пример работы программы
Заключение
В данном курсовом проекте был рассмотрен алгоритм шифрования CAST, его свойства и стойкость. Произведено шифрование и дешифрование на примере. В приложении приведены исходный код программы и библиотеки
Cast128 и Tools.
Список литературы
1.CAST-128 [Электронный ресурс]: http://tools.ietf.org/html/rfc2144 (Дата обращения 25.05.2014)
2.CAST-256 [Электронный ресурс]: http://www.rfc-editor.org/rfc/rfc2612.txt (Дата обращения 25.05.2014)
3.Алгоритм CAST-128 | Блог о шифровании [Электронный ресурс]: http://crypto.pp.ua/2010/05/algoritm-cast-128/ (Дата обращения 25.05.2014)
Приложение 1 – Исходный код программы
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, CAST128;
const NameFile='folder\picture.png'; NameFile2='folder\picture2.png'; NameFile3='folder\picture3.png';
var
Block:array[0..7] of byte; Block2:array[0..7] of byte; Key: array[0..15] of byte; D:TCast128Data;
i:integer; f1,f2,f3:file of byte;
CheckByte,CheckByte1,OneByte:byte;
Flag:boolean; begin
randomize;
writeln('Start: ',timetostr(now)); assignfile(f1,NameFile); reset(f1); assignfile(f2,NameFile2); rewrite(f2);
//===========8-check================= CheckByte:=0;
while not eof(f1) do begin
read(f1,OneByte); CheckByte:=(CheckByte+1) mod 8;
end; CheckByte:=8-CheckByte; reset(f1);
//========KEY======================== For i:=0 to 15 do Key[i]:=random(256); Cast128Init(D,@Key,Sizeof(Key),nil);
//========Encrypt==================== if CheckByte>0 then flag:=false else flag:=true; write(f2,CheckByte);
While not eof(f1) do Begin
if flag then blockread(f1,Block,8) else begin
for I:=0 to 7 do
if i<CheckByte then block[i]:=CheckByte else begin
read(f1,OneByte);
block[i]:=OneByte;
end;
flag:=true;
end;
Cast128EncryptECB(D,@Block,@Block2);
blockwrite(f2,Block2,8);
End;
closefile(f1);
closefile(f2);
writeln('Encryption completed: ',chr(7),timetostr(now));
//=======================LEVEL- 2================================
assignfile(f2,NameFile2);
reset(f2);
assignfile(f3,NameFile3);
rewrite(f3);
//===========8-check===================== read(f2,CheckByte);
if CheckByte>0 then flag:=false else flag:=true;
//========Decrypt======================== While not eof(f2) do
Begin blockread(f2,Block,8);
//=======================
Cast128DecryptECB(D,@Block,@Block2); if flag then blockwrite(f3,Block2,8) else begin
for I:=CheckByte to 7 do write(f3,Block2[i]); flag:=true;
end;
End;
closefile(f3);
closefile(f2);
writeln('Decryption completed: ',chr(7),timetostr(now));
readln;
end.
Приложение 2 – Библиотека Cast128
unit Cast128; |
|
interface |
|
uses |
|
Sysutils, Tools; |
|
type |
|
TCast128Data= record |
|
InitBlock: array[0..7] of byte; |
{ initial IV } |
LastBlock: array[0..7] of byte; |
{ current IV } |
xKey: array[0..31] of DWord; |
|
Rounds: integer; |
|
end; |
|
function Cast128SelfTest: boolean;
{ performs a self test on this implementation }
procedure Cast128Init(var Data: TCast128Data; Key: pointer; Len: integer; IV: pointer);
{ initializes the TCast128Data structure with the key information and IV if applicable }
procedure Cast128Burn(var Data: TCast128Data); { erases all information about the key }
procedure Cast128EncryptECB(const Data: TCast128Data; InData, OutData: pointer);
{ encrypts the data in a 64bit block using the ECB mode }
procedure Cast128EncryptCBC(var Data: TCast128Data; InData, OutData: pointer);
{ encrypts the data in a 64bit block using the CBC chaining mode } |
|
procedure Cast128EncryptOFB(var Data: TCast128Data; InData, |
OutData: |
pointer); |
|
{ encrypts the data in a 64bit block using the OFB chaining mode } |
|
procedure Cast128EncryptCFB(var Data: TCast128Data; InData, |
OutData: |
pointer; Len: integer); |
|
{ encrypts Len bytes of data using the CFB chaining mode } |
|
procedure Cast128EncryptOFBC(var Data: TCast128Data; InData, |
OutData: |
pointer; Len: integer); |
|
{ encrypts Len bytes of data using the OFB counter chaining mode } |
|
procedure Cast128DecryptECB(const Data: TCast128Data; InData, |
OutData: |
pointer); |
|
{ decrypts the data in a 64bit block using the ECB mode } |
|
procedure Cast128DecryptCBC(var Data: TCast128Data; InData, |
OutData: |
pointer); |
|
{ decrypts the data in a 64bit block using the CBC chaining mode } |
|
procedure Cast128DecryptOFB(var Data: TCast128Data; InData, |
OutData: |
pointer); |
|
{ decrypts the data in a 64bit block using the OFB chaining mode } |
|
procedure Cast128DecryptCFB(var Data: TCast128Data; InData, |
OutData: |
pointer; Len: integer); |
|
{ decrypts Len bytes of data using the CFB chaining mode } |
|
procedure Cast128DecryptOFBC(var Data: TCast128Data; InData, |
OutData: |
pointer; Len: integer); |
|
{ decrypts Len bytes of data using the OFB counter chaining mode } |
|
procedure Cast128Reset(var Data: TCast128Data); |
|
{ resets the chaining mode information } |
|