unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
public
end;
TState = Array[0..3,0..3] of Byte;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ShiftRows(var State: TState);
var
i,j,k : Integer;
begin
for j := 1 to 3 do
begin
k := State[0,j];
State[0,j] := State[1,j];
State[1,j] := State[2,j];
State[2,j] := State[3,j];
State[3,j] := k;
end;
end;
procedure ShiftCols(var State: TState);
var
i,j,k : Integer;
begin
for j := 1 to 3 do
begin
k := State[j,0];
State[j,0] := State[j,1];
State[j,1] := State[j,2];
State[j,2] := State[j,3];
State[j,3] := k;
end;
end;
procedure InvShiftRows(var State: TState);
var
i,j,k : Integer;
begin
for j := 1 to 3 do
begin
k := State[3,j];
State[3,j] := State[2,j];
State[2,j] := State[1,j];
State[1,j] := State[0,j];
State[0,j] := k;
end;
end;
procedure InvShiftCols(var State: TState);
var
i,j,k : Integer;
begin
for j := 1 to 3 do
begin
k := State[j,3];
State[j,3] := State[j,2];
State[j,2] := State[j,1];
State[j,1] := State[j,0];
State[j,0] := k;
end;
end;
function StringToHex(S : String): String;
var
i: Integer;
begin
for i := 1 to Length(S) do
Result := Result + IntToHex(Ord(S[i]), 2);
end;
function HexToString(S : String): String;
var
i : Integer;
begin
for i := 1 to Length(S) do
if ((i mod 2) = 1) then
Result := Result + Chr(StrToInt('0x' + Copy(S, i, 2)));
end;
function Encode(DataStr, Key : String) : String;
var
i : Integer;
AuxStr : String;
AuxKey : LongWord;
Src, Dst : TStringStream;
State : TState;
begin
Src := TStringStream.Create(DataStr);
Dst := TStringStream.Create('');
FillChar(State,Sizeof(State),#0);
while Src.Read(State,Sizeof(State)) > 0 do
begin
ShiftRows(State);
ShiftCols(State);
Dst.WriteBuffer(State,Sizeof(State));
FillChar(State,Sizeof(State),#0);
end;
AuxKey := 0;
for i := 1 to length(Key) do
AuxKey := (AuxKey + ord(Key[i])) xor Length(Key);
for i:=1 to length(Dst.DataString) do
AuxStr := AuxStr + chr(ord(Dst.DataString[i]) xor AuxKey);
Result := StringToHex(AuxStr);
end;
function Decode(DataStr, Key : String) : String;
var
i : Integer;
AuxStr : String;
AuxKey : LongWord;
Src, Dst : TStringStream;
State : TState;
begin
DataStr := HexToString(DataStr);
Src := TStringStream.Create(DataStr);
Dst := TStringStream.Create('');
FillChar(State,Sizeof(State),#0);
while Src.Read(State,Sizeof(State)) > 0 do
begin
InvShiftCols(State);
InvShiftRows(State);
Dst.WriteBuffer(State,Sizeof(State));
FillChar(State,Sizeof(State),#0);
end;
AuxKey := 0;
for i := 1 to length(Key) do
AuxKey := (AuxKey + ord(Key[i])) xor Length(Key);
for i:=1 to length(Dst.DataString) do
AuxStr := AuxStr + chr(ord(Dst.DataString[i]) xor AuxKey);
Result := AuxStr;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo2.Text := Encode(Memo1.Text, Edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo3.Text := Decode(Memo2.Text, Edit1.Text);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.Text := EmptyStr;
Memo1.Clear;
Memo2.Clear;
Memo3.Clear;
end;
end.