unit TeaUnit;interfaceconst Delta: longword = $9e3779b9;type TLong2 = array[0.. 1] of Longword; // 64-bit TTeaKey = array[0..3] of longword; // 128-bit TByte16 = array[0..15] of byte; // 128-bit TByte4 = array[0..3] of byte; // 32-bit TTeaData = array of longword; // n*32-bit TByteArrData = array of byte; // n*8-bitprocedure TeaEncrypt(var data: TLong2; const key: TTeaKey); procedure TeaDecrypt(var data: TLong2; const key: TTeaKey); procedure XTeaEncrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32); procedure XTeaDecrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32); procedure BlockTeaEncrypt(data: TTeaData; const key: TTeaKey); procedure BlockTeaDecrypt(data: TTeaData; const key: TTeaKey); procedure XXTeaEncrypt(data: TTeaData; const key: TTeaKey); procedure XXTeaDecrypt(data: TTeaData; const key: TTeaKey); function SameKey(const key1, key2: TTeaKey): boolean; procedure StrToKey(const s: string; var key: TTeaKey); function KeyToStr(const key: TTeaKey): string; procedure StrToData(const s: string; var data: TTeaData); procedure DataToStr(var s: string; const data: TTeaData); procedure ReadData(const FileName: string; var data: TTeaData); procedure WriteData(const FileName: string; var data: TTeaData);implementationuses math, SysUtils;procedure TeaEncrypt(var data: TLong2; const key: TTeaKey); var y,z,sum: Longword; a:byte; begin y:=data[0]; z:=data[1]; sum:=0; for a:=0 to 31 do begin inc(sum,Delta); inc(y,((z shl 4)+key[0]) xor (z+sum) xor ((z shr 5)+key[1])); inc(z,((y shl 4)+key[2]) xor (y+sum) xor ((y shr 5)+key[3])); end; data[0]:=y; data[1]:=z end;procedure TeaDecrypt(var data: TLong2; const key: TTeaKey); var y,z,sum: Longword; a:byte; begin y:=data[0]; z:=data[1]; sum:=delta shl 5; for a:=0 to 31 do begin dec(z,((y shl 4)+key[2]) xor (y+sum) xor ((y shr 5)+key[3])); dec(y,((z shl 4)+key[0]) xor (z+sum) xor ((z shr 5)+key[1])); dec(sum,Delta); end; data[0]:=y; data[1]:=z end;procedure XTeaEncrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32); var y,z,sum,limit: Longword; begin y:=data[0]; z:=data[1]; sum:=0; limit := Delta*N; while sum <> limit do begin inc(y,((z shl 4) xor (z shr 5)) xor (sum+key[sum and 3])); inc(sum,Delta); inc(z,((y shl 4) xor (y shr 5)) xor (sum+key[(sum shr 11) and 3])); end; data[0]:=y; data[1]:=z end;procedure XTeaDecrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32); var y,z,sum: Longword; begin y:=data[0]; z:=data[1]; sum:=Delta*N; while sum <> 0 do begin dec(z,((y shl 4) xor (y shr 5)) xor (sum+key[(sum shr 11) and 3])); dec(sum,Delta); dec(y,((z shl 4) xor (z shr 5)) xor (sum+key[sum and 3])); end; data[0]:=y; data[1]:=z end;procedure BlockTeaEncrypt(data: TTeaData; const key: TTeaKey); var z, y, sum, e, p: longword; q, n: integer; function mx: longword; begin result := (((z shl 4) xor (z shr 5)) + z) xor (key[(p and 3) xor e] + sum); end;begin n := Length(data); q := 6 + 52 div n; z := data[n-1]; sum := 0; repeat inc(sum,Delta); e := (sum shr 2) and 3; for p := 0 to n-1 do begin y := data[p]; inc(y,mx); data[p] := y; z := y; end; dec(q); until q = 0; end;procedure BlockTeaDecrypt(data: TTeaData; const key: TTeaKey); var z, y, sum, e, p, q: longword; n: integer; function mx: longword; begin result := (((z shl 4) xor (z shr 5)) + z) xor (key[(p and 3) xor e] + sum); end;begin n := Length(data); q := 6 + 52 div n; sum := q*Delta; while sum <> 0 do begin e := (sum shr 2) and 3; for p := n-1 downto 1 do begin z := data[p-1]; y := data[p]; dec(y,mx); data[p] := y; end; z := data[n-1]; y := data[0]; dec(y,mx); data[0] := y; dec(sum,Delta); end; end;procedure XXTeaEncrypt(data: TTeaData; const key: TTeaKey); var z, y, x, sum, e, p: longword; q, n: integer; function mx: longword; begin result := (((z shr 5) xor (y shl 2)) + ((y shr 3) xor (z shl 4))) xor ((sum xor y) + (key[(p and 3) xor e] xor z) ); end;begin n := Length(data); q := 6 + 52 div n; z := data[n-1]; y := data[0]; sum := 0; repeat inc(sum,Delta); e := (sum shr 2) and 3; for p := 0 to n-2 do begin y := data[p+1]; x := data[p]; inc(x,mx); data[p] := x; z := x; end; y := data[0]; x := data[n-1]; inc(x,mx); data[n-1] := x; z := x; dec(q); until q = 0; end;procedure XXTeaDecrypt(data: TTeaData; const key: TTeaKey); var z, y, x, sum, e, p, q: longword; n: integer; function mx: longword; begin result := (((z shr 5) xor (y shl 2)) + ((y shr 3) xor (z shl 4))) xor ((sum xor y) + (key[(p and 3) xor e] xor z) ); end;begin n := Length(data); q := 6 + 52 div n; z := data[n-1]; y := data[0]; sum := q*Delta; while sum <> 0 do begin e := (sum shr 2) and 3; for p := n-1 downto 1 do begin z := data[p-1]; x := data[p]; dec(x,mx); data[p] := x; y := x; end; z := data[n-1]; x := data[0]; dec(x,mx); data[0] := x; y := x; dec(sum,Delta); end; end;function SameKey(const key1, key2: TTeaKey): boolean; var i: integer; begin result := false; for i := 0 to 3 do if key1[i] <> key2[i] then exit; result := true; end;procedure StrToKey(const s: string; var key: TTeaKey); var sa, sb: AnsiString; i, n: integer; begin sa := AnsiString(s); sb := StringOfChar(' ',16); n := min(Length(sa),16); for i := 1 to n do sb[i] := sa[i]; for i := 1 to 16 do TByte16(key)[i-1] := ord(sb[i]); sa := ''; sb := ''; end;function KeyToStr(const key: TTeaKey): string; var s: AnsiString; i: integer; begin SetLength(s,16); for i := 1 to 16 do begin s[i] := Chr(TByte16(key)[i-1]); end; result := s; end;procedure StrToData(const s: string; var data: TTeaData); var sa: AnsiString; i, n, m: integer; begin sa := AnsiString(s); n := Length(sa) div 4; m := Length(sa) mod 4; if m <> 0 then begin inc(n); sa := sa + StringOfChar(' ',m); end; if n < 2 then // n = 1 begin n := 2; sa := sa + StringOfChar(' ',4); end; SetLength(data,n); for i := 0 to n-1 do for m := 0 to 3 do TByte4(data[i])[m] := ord(sa[i*4+m+1]); sa := ''; end;procedure DataToStr(var s: string; const data: TTeaData); var sa: AnsiString; i, n, m: integer; b: byte; begin n := Length(data); SetLength(sa,n*4); for i := 0 to n-1 do for m := 0 to 3 do begin b := TByte4(data[i])[m]; sa[i*4+m+1] := Chr(b); end; s := Trim(sa); sa := ''; end;procedure ReadData(const FileName: string; var data: TTeaData); var i, n: integer; ww: longword; wwf: file of longword; begin try AssignFile(wwf,FileName); Reset(wwf); n := FileSize(wwf); SetLength(data,n); for i := 0 to n-1 do begin read(wwf,ww); data[i] := ww; end; finally CloseFile(wwf); end; end;procedure WriteData(const FileName: string; var data: TTeaData); var i, n: integer; ww: longword; wwf: file of longword; begin try AssignFile(wwf,FileName); Rewrite(wwf); n := Length(data); for i := 0 to n-1 do begin ww := data[i]; write(wwf,ww); end; finally CloseFile(wwf); end; end;end.
To ksaiy(阳光总在风雨后) ,能给每个函数加个注释吗? 我不太了解TEA算法,能说明一下每个函数的功能吗?
Delta: longword = $9e3779b9;type TLong2 = array[0.. 1] of Longword; // 64-bit
TTeaKey = array[0..3] of longword; // 128-bit
TByte16 = array[0..15] of byte; // 128-bit
TByte4 = array[0..3] of byte; // 32-bit
TTeaData = array of longword; // n*32-bit
TByteArrData = array of byte; // n*8-bitprocedure TeaEncrypt(var data: TLong2; const key: TTeaKey);
procedure TeaDecrypt(var data: TLong2; const key: TTeaKey);
procedure XTeaEncrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32);
procedure XTeaDecrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32);
procedure BlockTeaEncrypt(data: TTeaData; const key: TTeaKey);
procedure BlockTeaDecrypt(data: TTeaData; const key: TTeaKey);
procedure XXTeaEncrypt(data: TTeaData; const key: TTeaKey);
procedure XXTeaDecrypt(data: TTeaData; const key: TTeaKey);
function SameKey(const key1, key2: TTeaKey): boolean;
procedure StrToKey(const s: string; var key: TTeaKey);
function KeyToStr(const key: TTeaKey): string;
procedure StrToData(const s: string; var data: TTeaData);
procedure DataToStr(var s: string; const data: TTeaData);
procedure ReadData(const FileName: string; var data: TTeaData);
procedure WriteData(const FileName: string; var data: TTeaData);implementationuses
math, SysUtils;procedure TeaEncrypt(var data: TLong2; const key: TTeaKey);
var
y,z,sum: Longword;
a:byte;
begin
y:=data[0];
z:=data[1];
sum:=0;
for a:=0 to 31 do
begin
inc(sum,Delta);
inc(y,((z shl 4)+key[0]) xor (z+sum) xor ((z shr 5)+key[1]));
inc(z,((y shl 4)+key[2]) xor (y+sum) xor ((y shr 5)+key[3]));
end;
data[0]:=y;
data[1]:=z
end;procedure TeaDecrypt(var data: TLong2; const key: TTeaKey);
var
y,z,sum: Longword;
a:byte;
begin
y:=data[0];
z:=data[1];
sum:=delta shl 5;
for a:=0 to 31 do
begin
dec(z,((y shl 4)+key[2]) xor (y+sum) xor ((y shr 5)+key[3]));
dec(y,((z shl 4)+key[0]) xor (z+sum) xor ((z shr 5)+key[1]));
dec(sum,Delta);
end;
data[0]:=y;
data[1]:=z
end;procedure XTeaEncrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32);
var
y,z,sum,limit: Longword;
begin
y:=data[0];
z:=data[1];
sum:=0;
limit := Delta*N;
while sum <> limit do
begin
inc(y,((z shl 4) xor (z shr 5)) xor (sum+key[sum and 3]));
inc(sum,Delta);
inc(z,((y shl 4) xor (y shr 5)) xor (sum+key[(sum shr 11) and 3]));
end;
data[0]:=y;
data[1]:=z
end;procedure XTeaDecrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32);
var
y,z,sum: Longword;
begin
y:=data[0];
z:=data[1];
sum:=Delta*N;
while sum <> 0 do
begin
dec(z,((y shl 4) xor (y shr 5)) xor (sum+key[(sum shr 11) and 3]));
dec(sum,Delta);
dec(y,((z shl 4) xor (z shr 5)) xor (sum+key[sum and 3]));
end;
data[0]:=y;
data[1]:=z
end;procedure BlockTeaEncrypt(data: TTeaData; const key: TTeaKey);
var
z, y, sum, e, p: longword;
q, n: integer; function mx: longword;
begin
result := (((z shl 4) xor (z shr 5)) + z) xor (key[(p and 3) xor e] + sum);
end;begin
n := Length(data);
q := 6 + 52 div n;
z := data[n-1];
sum := 0;
repeat
inc(sum,Delta);
e := (sum shr 2) and 3;
for p := 0 to n-1 do
begin
y := data[p];
inc(y,mx);
data[p] := y;
z := y;
end;
dec(q);
until q = 0;
end;procedure BlockTeaDecrypt(data: TTeaData; const key: TTeaKey);
var
z, y, sum, e, p, q: longword;
n: integer; function mx: longword;
begin
result := (((z shl 4) xor (z shr 5)) + z) xor (key[(p and 3) xor e] + sum);
end;begin
n := Length(data);
q := 6 + 52 div n;
sum := q*Delta;
while sum <> 0 do
begin
e := (sum shr 2) and 3;
for p := n-1 downto 1 do
begin
z := data[p-1];
y := data[p];
dec(y,mx);
data[p] := y;
end;
z := data[n-1];
y := data[0];
dec(y,mx);
data[0] := y;
dec(sum,Delta);
end;
end;procedure XXTeaEncrypt(data: TTeaData; const key: TTeaKey);
var
z, y, x, sum, e, p: longword;
q, n: integer; function mx: longword;
begin
result := (((z shr 5) xor (y shl 2)) + ((y shr 3) xor (z shl 4))) xor ((sum xor y) + (key[(p and 3) xor e] xor z) );
end;begin
n := Length(data);
q := 6 + 52 div n;
z := data[n-1];
y := data[0];
sum := 0;
repeat
inc(sum,Delta);
e := (sum shr 2) and 3;
for p := 0 to n-2 do
begin
y := data[p+1];
x := data[p];
inc(x,mx);
data[p] := x;
z := x;
end;
y := data[0];
x := data[n-1];
inc(x,mx);
data[n-1] := x;
z := x;
dec(q);
until q = 0;
end;procedure XXTeaDecrypt(data: TTeaData; const key: TTeaKey);
var
z, y, x, sum, e, p, q: longword;
n: integer; function mx: longword;
begin
result := (((z shr 5) xor (y shl 2)) + ((y shr 3) xor (z shl 4))) xor ((sum xor y) + (key[(p and 3) xor e] xor z) );
end;begin
n := Length(data);
q := 6 + 52 div n;
z := data[n-1];
y := data[0];
sum := q*Delta;
while sum <> 0 do
begin
e := (sum shr 2) and 3;
for p := n-1 downto 1 do
begin
z := data[p-1];
x := data[p];
dec(x,mx);
data[p] := x;
y := x;
end;
z := data[n-1];
x := data[0];
dec(x,mx);
data[0] := x;
y := x;
dec(sum,Delta);
end;
end;function SameKey(const key1, key2: TTeaKey): boolean;
var
i: integer;
begin
result := false;
for i := 0 to 3 do
if key1[i] <> key2[i] then
exit;
result := true;
end;procedure StrToKey(const s: string; var key: TTeaKey);
var
sa, sb: AnsiString;
i, n: integer;
begin
sa := AnsiString(s);
sb := StringOfChar(' ',16);
n := min(Length(sa),16);
for i := 1 to n do
sb[i] := sa[i];
for i := 1 to 16 do
TByte16(key)[i-1] := ord(sb[i]);
sa := '';
sb := '';
end;function KeyToStr(const key: TTeaKey): string;
var
s: AnsiString;
i: integer;
begin
SetLength(s,16);
for i := 1 to 16 do
begin
s[i] := Chr(TByte16(key)[i-1]);
end;
result := s;
end;procedure StrToData(const s: string; var data: TTeaData);
var
sa: AnsiString;
i, n, m: integer;
begin
sa := AnsiString(s);
n := Length(sa) div 4;
m := Length(sa) mod 4;
if m <> 0 then
begin
inc(n);
sa := sa + StringOfChar(' ',m);
end;
if n < 2 then // n = 1
begin
n := 2;
sa := sa + StringOfChar(' ',4);
end; SetLength(data,n);
for i := 0 to n-1 do
for m := 0 to 3 do
TByte4(data[i])[m] := ord(sa[i*4+m+1]);
sa := '';
end;procedure DataToStr(var s: string; const data: TTeaData);
var
sa: AnsiString;
i, n, m: integer;
b: byte;
begin
n := Length(data);
SetLength(sa,n*4);
for i := 0 to n-1 do
for m := 0 to 3 do
begin
b := TByte4(data[i])[m];
sa[i*4+m+1] := Chr(b);
end;
s := Trim(sa);
sa := '';
end;procedure ReadData(const FileName: string; var data: TTeaData);
var
i, n: integer;
ww: longword;
wwf: file of longword;
begin
try
AssignFile(wwf,FileName);
Reset(wwf);
n := FileSize(wwf);
SetLength(data,n);
for i := 0 to n-1 do
begin
read(wwf,ww);
data[i] := ww;
end;
finally
CloseFile(wwf);
end;
end;procedure WriteData(const FileName: string; var data: TTeaData);
var
i, n: integer;
ww: longword;
wwf: file of longword;
begin
try
AssignFile(wwf,FileName);
Rewrite(wwf);
n := Length(data);
for i := 0 to n-1 do
begin
ww := data[i];
write(wwf,ww);
end;
finally
CloseFile(wwf);
end;
end;end.
我不太了解TEA算法,能说明一下每个函数的功能吗?
mydata : TTeaData;
mykey : TTeaKey;
mydata1 : TLong2;
sTemp : string;begin
sTemp := 'myKey';
StrToKey(sTemp,mykey);
sTemp := 'it's a data';
StrToData(sTemp, mydata);
//然后问题就出现了,下面这个要求的是TLong2类型,上面转换的是TTeaData类型。
XTeaEncrypt(var data: TLong2; const key: TTeaKey; N: Longword = 32);
end;该怎么用呢?