Изучаем сети Фейштеля

1. Постановка задачи

– Разработать программу шифрования и дешифрования текста;

– Метод шифрования: сети Фейштеля;

– Произвести шифрование исходного текста, получить шифрограмму, осуществить ее дешифрование и сравнение с исходным текстом.

2. Теоретическое введение

Сеть Фейштеля получила широкое распространение, поскольку обеспечивает выполнение требования о многократном использовании ключа и материала исходного блока информации. Классическая сеть Фейштеля имеет следующую структуру:

Независимые потоки информации, порожденные из исходного блока, называются ветвями сети. В классической схеме их две. Величины Vi именуются параметрами сети, обычно это функции от материала ключа. Функция F называется образующей. Действие, состоящее из однократного вычисления образующей функции и последующего наложения ее результата на другую ветвь с обменом их местами, называется циклом или раундом (англ. round) сети Фейштеля. Оптимальное число раундов K – от 8 до 32. Часто количество раундов не фиксируется разработчиками алгоритма, а лишь указываются разумные пределы (обязательно нижний, и не всегда – верхний) этого параметра.

Данная схема является обратимой. Сеть Фейштеля обладает тем свойством, что даже если в качестве образующей функции F будет использовано необратимое преобразование, то и в этом случае вся цепочка будет восстановима.

3. Программная реализация

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

type

TBlock = array [1..4] of byte;

TFB = file of byte;

TForm1 = class(TForm)

Button1: TButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Edit1: TEdit;

RadioGroup1: TRadioGroup;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure ReadTBlock(var f:TFB; var bl:TBlock);

var

b,i:byte;

begin

i:=1;

while (not EoF(f))and(i<5) do

begin

Read(f,b);

bl[i]:=b;

i:=i+1;

end;

end;

function MyRol(b:byte; i:byte):byte;

begin

asm

mov cl,i

mov al,b

rol al,cl

mov result,al

end;

end;

function MyRor(b:byte; i:byte):byte;

begin

asm

mov cl, i

mov al, b

ror al, cl

mov result, al

end;

end;

procedure RoundTblockC(var bl:TBlock; hk:byte);

var

f:byte;

begin

f:=(bl[1] xor hk) xor bl[2];

bl[2]:=bl[3];

bl[3]:=bl[4];

bl[4]:=bl[1];

bl[1]:=f;

end;

procedure RoundTblockD(var bl:TBlock; hk:byte);

var

f:byte;

begin

f:=(bl[1] xor hk) xor bl[4];

bl[1]:=bl[4];

bl[4]:=bl[3];

bl[3]:=bl[2];

bl[2]:=f;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

f1:TFB;

f2: file of TBlock;

block:TBlock;

i:byte;

hk,k1,k2:byte;

k:word;

begin

if OpenDialog1.Execute and SaveDialog1.Execute then

begin

AssignFile(f1,OpenDialog1.FileName);

AssignFile(f2,SaveDialog1.FileName);

Reset(f1);

Rewrite(f2);

k:=StrToInt(Edit1.Text);

asm

mov ax,k

mov k1,ah

mov k2,al

end;

while not EoF(f1) do

begin

ReadTBlock(f1,block);

//íà÷èíàþòñÿ ðàóíäû

if RadioGroup1.ItemIndex=0 then

begin //coding

for i:=0 to 21 do

begin

hk:=MyRol(k1,i) + MyRor(k2,i);

RoundTblockC(block,hk);

end;

end

else

begin //decoding

for i:=21 downto 0 do

begin

hk:=MyRol(k1,i) xor MyRor(k2,i);

RoundTblockD(block,hk);

end;

end;

//ïîñëå 8 ðàóíäîâ

Write(f2,block);

end;

CloseFile(f1);

CloseFile(f2);

end;

end;

end.

4. Результаты выполнения программы

Исходный текст:

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Закодированный текст:

Жyыbс\а@)…ьљ­l”­©а,YеЙ0

ЈЯ9.Й©`˜Ё+ђїMqгРd_АЗ?1Љд_Rиеi*О°ЅЕ=ЯюD»Йn]ж€_~Вк[NпЉNYбаqLБХ>1Љд_DтфsNпЉNDтфs»Йn]ж€_~Вк[MмЉMYбаqLБХ>1Љд_DтфsMмЉMDтфs»Йn]ж€_~Вк[LнЉLYбаqLБХ>1Љд_DтфsLнЉLDтфs»Йn^е‹_@рЕAvАкZgЧх[1]oлО{ZМБX)љ°T6§ОrpёҐ,kсиm{ГпQNпЉNFкаzPгбzc„щ

Расшифрованный текст:

Исходный текст:

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;z

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100