当前位置:主页>销售管理软件> 列表

请问:TEA算法的使用,最好有原代码或者说明,谢谢 找excel进销存

仓库管理软件版1楼: 请问:TEA算法的使用,最好有原代码或者说明,谢谢

2楼: 楼主,我有一本Delphi算法大全,好书
要不? 如excel进销存

3楼: http://www.codek.cn/soft/13425.htm
http://www.cnsdn.net/forum/Announce/announce.asp?BoardID=103&ID=209
http://download.zol.com.cn/detail/4/30392.shtml
都打开看看啊

4楼: 这些代码我都有
但是不知道怎么用啊

5楼: 我在写QQ的挂机程序时写的一个类
unit TeaUnit;

interface
Uses Classes,Windows;
{
QQ TEA-16 Encrypt/Decrypt Class Moudle
}
type
TArrays = array of byte;
TTea =Class
private
Plain:TArrays ; //指向当前的明文块
prePlain:TArrays; //指向前面一个明文块
cOut:TArrays; //输出的密文或者明文
Crypt:LongInt;
preCrypt:LongInt; //当前加密的密文位置和上一次加密的密文块位置,他们相差8
Pos:LongInt; //当前处理的加密解密块的位置


padding :LongInt; //填充数
Key :TArrays; //密钥
Header: Boolean; //用于加密时,表示当前是否是第一个8字节块,因为加密算法
//是反馈的,但是最开始的8个字节没有反馈可用,所有需要标
//明这种情况
contextStart:LongInt; //这个表示当前解密开始的位置,之所以要这么一个变量是为了
//避免当解密到最后时后面已经没有数据,这时候就会出错,这
Function Encipher(arrayIn:TArrays;arrayKey :TArrays; Var ResultValue:TArrays;offset:LongInt=0):Integer;
Function Encrypt8Bytes(arrayKey :TArrays):Integer; //个变量就是用来判断这种情况免得出错
Function Decipher(arrayIn:TArrays;arrayKey :TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;
Function Decrypt8Bytes(arrayIn:TArrays;arrayKey:TArrays;offset:LongInt=0):boolean;


Function Rand() : LongInt;
public
Function Encrypt(arrayIn:TArrays;arrayKey :TArrays; Var ResultValue:TArrays;offset:LongInt=0):Integer;
Function Decrypt(arrayIn:TArrays;arrayKey :TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;
end;

implementation
//功能:QQ的Tea加密函数,将给定的字节数组,用给定的密钥加密,并将加密后的值返回
//参数:arrayIn 需要加密的字节数组
// arrayKey 加密密钥
// ResultValue 加密后的值
// offset:从需要加密的数组的第offset字节开始加密
//返回值:0
Function TTea.Encrypt(arrayIn:TArrays;arrayKey: TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;
var
i,l,k : LongInt;
temp:Integer;
begin
SetLength(Plain,0) ; //这里的作用就是保证,再重新分配8个字节后,每个字节都是0值
SetLength(prePlain,0) ; //
SetLength(Plain,8) ;
SetLength(prePlain,8) ;


Pos := 1 ;
padding := 0 ;
Crypt:= 0 ;
preCrypt := 0;
SetLength(key,16);
CopyMemory(@Key[0], @arrayKey[0], 16 );
Header := True;
Pos := 2 ;

Pos := (High(arrayIn) + 11) Mod 8 ;

If Pos <> 0 Then Pos := 8 - Pos;
temp:= High(arrayIn)+1 + Pos + 10;
if (temp mod 8 <>0) or (temp<=0) then temp:=16;
SetLength(COut,temp);
k:=Rand;

Plain[0] := (k And $F8) Or Pos;
For I := 1 To Pos do
begin

k:= Rand;

Plain[I] := k And $FF;
end;
Pos := Pos + 1 ;
padding := 1 ;
While padding < 3 do
begin
If Pos < 8 Then
begin
k:=Rand;
Plain[Pos] := k And $FF ;
padding := padding + 1;
Pos := Pos + 1;
end
Else
begin
If Pos = 8 Then
Encrypt8Bytes(arrayKey) ;
End;
end;
I := offset;
l := 0;

l := High(arrayIn) + 1 ;

While l > 0 do
begin
If Pos < 8 Then

begin
Plain[Pos] := arrayIn[I];
I := I + 1 ;
Pos := Pos + 1 ;
l := l - 1 ;
end
Else
begin
If Pos = 8 Then
Encrypt8Bytes(arrayKey) ;
End ;
end;
padding := 1 ;
While padding < 9 do
begin
If Pos < 8 Then
begin
Plain[Pos] := 0;
Pos := Pos + 1 ;
padding := padding + 1;
end
Else
begin
If Pos = 8 Then
Encrypt8Bytes(arrayKey) ;
End;
end;
ResultValue := cOut ;


Result:=0;
end;
//功能:Tea加密函数,将给定的8字节数组,用给定的密钥加密,并将加密后的值返回
//参数:arrayIn 需要加密的8字节数组
// arrayKey 加密密钥
// ResultValue 加密后的值
// offset:从需要加密的数组的第offset字节开始加密8个字节
//返回值:0
Function TTea.Encipher(arrayIn:TArrays;arrayKey: TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;


var
i,Y,z,a,b,c,d,sum,delta:LongInt;
tmpArray:array[0..23]of Byte ;

begin
Result:=1;
If High(arrayIn)+1 < 7 Then Exit ;
If High(arrayKey)+1 < 15 Then Exit ;
sum := 0;
delta := $9E3779B9;
delta := delta And $FFFFFFFF ;
tmpArray[3] := arrayIn[offset];
tmpArray[2] := arrayIn[offset + 1];
tmpArray[1] := arrayIn[offset + 2];
tmpArray[0] := arrayIn[offset + 3];
tmpArray[7] := arrayIn[offset + 4];
tmpArray[6] := arrayIn[offset + 5];
tmpArray[5] := arrayIn[offset + 6];
tmpArray[4] := arrayIn[offset + 7];
tmpArray[11] := arrayKey[0];
tmpArray[10] := arrayKey[1];
tmpArray[9] := arrayKey[2];
tmpArray[8] := arrayKey[3];
tmpArray[15] := arrayKey[4];
tmpArray[14] := arrayKey[5];
tmpArray[13] := arrayKey[6];
tmpArray[12] := arrayKey[7];
tmpArray[19] := arrayKey[8];
tmpArray[18] := arrayKey[9];
tmpArray[17] := arrayKey[10];
tmpArray[16] := arrayKey[11];

tmpArray[23] := arrayKey[12];
tmpArray[22] := arrayKey[13];
tmpArray[21] := arrayKey[14];
tmpArray[20] := arrayKey[15];
CopyMemory(@Y, @tmpArray[0], 4);
CopyMemory(@z, @tmpArray[4], 4);
CopyMemory(@a, @tmpArray[8], 4) ;
CopyMemory(@b, @tmpArray[12], 4);
CopyMemory(@c, @tmpArray[16], 4);
CopyMemory(@d, @tmpArray[20], 4);
For I := 1 To 16 do
begin
sum := sum+delta;
sum := sum And $FFFFFFFF;

Y := Y+( ((z shl 4)+ a) Xor (z+ sum) Xor ((z shr 5)+ b));
Y := Y And $FFFFFFFF ;
z := z+(((Y shl 4)+ c) Xor (Y+sum) Xor ((Y shr 5)+d));
z := z And $FFFFFFFF ;
end;
CopyMemory(@tmpArray[0], @Y, 4);
CopyMemory(@tmpArray[4], @z, 4);
ResultValue[0] := tmpArray[3];
ResultValue[1] := tmpArray[2];
ResultValue[2] := tmpArray[1];
ResultValue[3] := tmpArray[0];
ResultValue[4] := tmpArray[7];
ResultValue[5] := tmpArray[6];
ResultValue[6] := tmpArray[5];
ResultValue[7] := tmpArray[4];

Result:=0;
end;
//功能:QQ的Tea加密函数,从需要加密的数据中的到8个字节的数据,然后将此8个字节的数据进行异或
// 然后再用Tea的加密算法加密
//参数:arrayIn 需要加密的8字节数组

//返回值:0
Function TTea.Encrypt8Bytes(arrayKey :TArrays):Integer;
var
i:LongInt;
Crypted:TArrays;
begin
SetLength(Crypted,8);
For i := 0 To 7 do
begin
If Header Then
begin
Plain[i] := Plain[i] Xor prePlain[i] ;
end
Else
begin
Plain[i] := Plain[i] Xor cOut[preCrypt + i] ;
End ;
End;
Encipher(Plain, Key ,Crypted);
For I := 0 To 7 do
cOut[Crypt + I] := Crypted[I];

For i:= 0 To 7 do
cOut[Crypt + i] := cOut[Crypt + i] Xor prePlain[i] ;

CopyMemory(@prePlain[0], @Plain[0], 8);

preCrypt := Crypt ;
Crypt := Crypt + 8 ;
Pos:=0;
Header := False;
Result:=0;
end;
//功能:QQ的Tea解密函数,将给定的字节数组,用给定的密钥解密,并将解密后的值返回
//参数:arrayIn 需要解密的字节数组
// arrayKey 解密密钥
// ResultValue解密后的值
// offset:从需要解密的数组的第offset字节开始加密
//返回值:0
Function TTea.Decrypt(arrayIn:TArrays;arrayKey: TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;
var
m:TArrays;
i,COunt :LongInt;
begin

If (High(arrayIn) < 15) Or ((High(arrayIn) Mod 8) <> 7) Then Exit ;
If High(arrayKey) <> 15 Then Exit ;

SetLength(m,offset+1 + 7);
SetLength(key,16);
CopyMemory(@Key[0], @arrayKey[0], 16);
Crypt := 0;
preCrypt := 0 ;

Decipher(arrayIn, arrayKey, prePlain,offset) ;
Pos := prePlain[0] And 7;
Count := High(arrayIn) - Pos - 9 ;
If Count < 0 Then Exit ;
SetLength(cOut,Count - 1+1);
preCrypt := 0;
Crypt := 8;
contextStart := 8;
Pos := Pos + 1;

padding := 1;
While padding < 3 do
begin
If Pos < 8 Then
begin
Pos := Pos + 1;
padding := padding + 1;
end
Else
begin
If Pos = 8 Then
begin

CopyMemory(@m[0], @arrayIn[0], High(m) + 1);
If not Decrypt8Bytes(arrayIn, arrayKey, offset) Then Exit ;
end;
End ;
end;
I := 0;
While Count <> 0 do
begin
If Pos < 8 Then
begin
cOut[I] := m[offset + preCrypt + Pos] Xor prePlain[Pos];
I := I + 1 ;
Count := Count - 1;
Pos := Pos + 1;
end
Else
begin
If Pos = 8 Then
begin
SetLength(m,High(arrayIn)+1);
CopyMemory(@m[0], @arrayIn[0], High(arrayIn) + 1);

preCrypt:= Crypt - 8;
If not Decrypt8Bytes(arrayIn,arrayKey, offset) Then Exit;

end;
End;
end;

For i := 1 To 7 do
begin
If Pos < 8 Then
begin
If (m[offset + preCrypt + Pos] Xor prePlain[Pos]) <> 0 Then Exit ;
Pos := Pos + 1;
end
Else
begin
If Pos = 8 Then
begin
CopyMemory(@m[0], @arrayIn[0], High(m) + 1);
preCrypt := Crypt ;
If not Decrypt8Bytes(arrayIn,arrayKey, offset) = False Then Exit ;
end;
End ;
end;
ResultValue := cOut;
Result:=0;
end;
//功能:Tea解密函数,将给定的8字节数组,用给定的密钥解密,并将解密后的值返回
//参数:arrayIn 需要解密的8字节数组
// arrayKey 解密密钥
// ResultValue 解密后的值
// offset:从需要解密的数组的第offset字节开始解密8个字节
//返回值:0
Function TTea.Decipher(arrayIn:TArrays;arrayKey: TArrays; Var ResultValue:TArrays ;offset:LongInt=0):Integer;
var
i,Y,z,a,b,c,d,sum,delta:LongInt;


tmpArray:array[0..23]of Byte ;
tmpOut: TArrays;
begin
Result:=1;
If High(arrayIn)+1 < 7 Then Exit ;
If High(arrayKey)+1 < 15 Then Exit ;
sum := $E3779B90 ;
sum := sum And $FFFFFFFF ;
delta := $9E3779B9 ;
delta := delta And $FFFFFFFF ;
tmpArray[3] := arrayIn[offset];
tmpArray[2] := arrayIn[offset + 1];
tmpArray[1] := arrayIn[offset + 2];
tmpArray[0] := arrayIn[offset + 3];
tmpArray[7] := arrayIn[offset + 4];
tmpArray[6] := arrayIn[offset + 5];
tmpArray[5] := arrayIn[offset + 6];
tmpArray[4] := arrayIn[offset + 7];
tmpArray[11] := arrayKey[0];
tmpArray[10] := arrayKey[1];
tmpArray[9] := arrayKey[2];
tmpArray[8] := arrayKey[3];
tmpArray[15] := arrayKey[4];
tmpArray[14] := arrayKey[5];
tmpArray[13] := arrayKey[6];
tmpArray[12] := arrayKey[7];
tmpArray[19] := arrayKey[8];
tmpArray[18] := arrayKey[9];
tmpArray[17] := arrayKey[10];
tmpArray[16] := arrayKey[11];
tmpArray[23] := arrayKey[12];
tmpArray[22] := arrayKey[13];
tmpArray[21] := arrayKey[14];
tmpArray[20] := arrayKey[15];
CopyMemory(@Y, @tmpArray[0], 4);
CopyMemory(@z, @tmpArray[4], 4);
CopyMemory(@a, @tmpArray[8], 4) ;
CopyMemory(@b, @tmpArray[12], 4);
CopyMemory(@c, @tmpArray[16], 4);
CopyMemory(@d, @tmpArray[20], 4);
For I := 1 To 16 do
begin
z := z-(((Y shl 4)+ c) Xor (Y+sum) Xor ((Y shr 5)+d));
z := z And $FFFFFFFF ;
Y := Y-( ((z shl 4)+ a) Xor (z+ sum) Xor ((z shr 5)+ b));
Y := Y And $FFFFFFFF ;

sum := sum-delta;
sum := sum And $FFFFFFFF;


end;
CopyMemory(@tmpArray[0], @Y, 4);
CopyMemory(@tmpArray[4], @z, 4);
SetLength(tmpOut,8);
tmpOut[0] := tmpArray[3];
tmpOut[1] := tmpArray[2];
tmpOut[2] := tmpArray[1];
tmpOut[3] := tmpArray[0];
tmpOut[4] := tmpArray[7];
tmpOut[5] := tmpArray[6];
tmpOut[6] := tmpArray[5];
tmpOut[7] := tmpArray[4];
ResultValue:=tmpOut;
Result:=0;
end;
//功能:QQ的Tea解密函数,从需要解密的数据中得到8个字节的数据,然后将此8个字节的数据进行异或
// 然后再用Tea的解密算法加密
//参数:arrayIn 需要解密的8字节数组
// arrayKey 解密得密钥
// offset 偏移量
//返回值:0
Function TTea.Decrypt8Bytes(arrayIn:TArrays;arrayKey:TArrays;offset:LongInt=0):boolean;
var
lngTemp:Longint;
i:Integer;
begin

Result:=false;
For i := 0 To 7 do
begin
If (contextStart + i) > High(arrayIn) Then
begin
Result := True;
Exit ;
End;
prePlain[i] := prePlain[i] Xor arrayIn[offset + Crypt + i];
end;
Pos := i;
Decipher(prePlain, Key,prePlain) ;

lngTemp := High(prePlain);

contextStart := contextStart + 8;
Crypt := Crypt + 8;
Pos := 0;
Result := True;

end;
//功能:返回一个随机整数值
//参数:
//返回值:随机整数值
Function TTea.Rand() : LongInt;
begin

Randomize;

Result := Random(2147483647);//1926415742;// Round(Random(5) * 2147483647+Random(5) * 2147483647);
End;
end.

6楼: 请问这位大侠
我怎门把一个数组解密后 数组的数据全是0啊

仓库管理软件版7楼: unit TEAU;

interface

type
PInteger = ^Integer;
TTEAEncryptor = class(TObject)
private
class procedure Encode(V,K:PInteger);
class procedure Decode(V,K:PInteger);
public
class procedure
EncodeBuffer(Buffer:Pointer;BufLen:Integ
er;Key:String);
class procedure
DecodeBuffer(Buffer:Pointer;BufLen:Integ
er;Key:String);
class function EncodeString(Value,Key:String):String;
class function DecodeString(Value,Key:String):String;
end;

implementation

{TTEAEncryptor}
// TEA encode a 64bit text with a 128bit key
// 64bit text in 2 32bit integers
// 128bit key in 4 32bit integers
class procedure TTEAEncryptor.Encode(V,K:PInteger);


var
Y,Z:Integer;
A,B,C,D:Integer;
N:Integer;
Delta:Integer;
Sum:Integer;
begin
Delta:=$9e3779b9;
Sum:=0;
Y:=V^; Inc(V); Z:=V^; Dec(V);
A:=K^; Inc(K); B:=K^; Inc(K); C:=K^; Inc(K); D:=K^;
N:=32;
while N > 0 do
begin
Inc(Sum,delta);
Inc(Y,(Z shl 4)+A XOR Z+Sum XOR (Z Shr 5)+B);
Inc(Z,(Y shl 4)+C XOR Y+Sum XOR (Y Shr 5)+D);
Dec(N);
end;
V^:=Y; Inc(V); V^:=Z;
end;

// TEA decode a 64bit text with a 128bit key
// 64bit text in 2 32bit integers
// 128bit key in 4 32bit integers
class procedure TTEAEncryptor.Decode(V,K:PInteger);
var
Y,Z:Integer;
A,B,C,D:Integer;
N:Integer;
Delta:Integer;
Sum:Integer;
begin
Delta:=$9e3779b9;
Sum:=Delta Shl 5 ;
Y:=V^; Inc(V); Z:=V^; Dec(V);
A:=K^; Inc(K); B:=K^; Inc(K); C:=K^; Inc(K); D:=K^;
N:=32;
while N > 0 do
begin
Dec(Z,(Y shl 4)+C XOR Y+Sum XOR (Y Shr 5)+D);
Dec(Y,(Z shl 4)+A XOR Z+Sum XOR (Z Shr 5)+B);
Dec(Sum,delta);
Dec(N);
end;
V^:=Y; Inc(V); V^:=Z;
end;
// Buffer pointer to 32 bit integers must be 64bit aligned
// BufLen = number of 32 bit integers
// key must be 128 bits (16 chars)
class procedure TTEAEncryptor. EncodeBuffer(Buffer:Pointer;BufLen:Integ
er;Key:String);
var
Ptr:PInteger;
begin
Ptr:=Buffer;
BufLen:=((BufLen+1) div 2);
while BufLen > 0 do
begin
Encode(Ptr,PInteger(PChar(Key)));
Inc(Ptr,2);
Dec(BufLen);
end;
end;
// Buffer pointer to 32 bit integers must be 64bit aligned
// BufLen = number of 32 bit integers
// key must be 128 bits (16 chars)
class procedure TTEAEncryptor. DecodeBuffer(Buffer:Pointer;BufLen:Integ
er;Key:String);
var
Ptr:PInteger;
begin
Ptr:=Buffer;
BufLen:=((BufLen+1) div 2);
while BufLen > 0 do
begin
Decode(Ptr,PInteger(PChar(Key)));
Inc(Ptr,2);
Dec(BufLen);
end;
end;
class function TTEAEncryptor.EncodeString(Value,Key:String):String;
begin
// pad key to 128 bits
while Length(Key) < 16 do Key:=Key+#$A5;
// pad Value to next 64 bit boundary
while (Length(Value) mod 8) <> 0 do Value:=Value+#0;

EncodeBuffer(PChar(Value),Length(Value) div 4,Key);
Result:=Value;
end;
class function TTEAEncryptor.DecodeString(Value,Key:String):String;
begin
// pad key to 128 bits
while Length(Key) < 16 do Key:=Key+#$A5;
// Value should already be 64 bit aligned
DecodeBuffer(PChar(Value),Length(Value) div 4,Key);
Result:=Value;
end;

end.

8楼: 多人接受答案了。