Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionunit XTeaCrypt; interface uses Windows, SysUtils; type pBytes = ^Bytes; Bytes = array of byte; pTeaBuffer = ^TTeaBuffer; TTeaBuffer = array[0..1] of LongWord; pTeaKey = ^TTeaKey; TTeaKey = array[0..3] of LongWord; const SizeOfTeaBuffer = SizeOf(TTeaBuffer); SizeOfTeaKey = SizeOf(TTeaKey); procedure XTea_Bloc_Crypt(var V: TTeaBuffer; const K: TTeaKey); procedure XTea_Bloc_Decrypt(var V: TTeaBuffer; const K: TTeaKey); procedure XTea_Crypt(const Buffer, Key; const BufferSize, KeySize : integer; var Dest: pBytes); procedure XTea_Decrypt(const Buffer, Key; const BufferSize, KeySize : integer; var Dest: pBytes); function XTea_Crypt_Str(const Buffer, Key: AnsiString): AnsiString; function XTea_Decrypt_Str(const Buffer, Key: AnsiString): AnsiString; implementation const _DELTA = $9E3779B9; _N = 32; type pArByte = ^ArByte; ArByte = array[0..0] of byte; procedure XTea_Bloc_Crypt(var V: TTeaBuffer; const K: TTeaKey); var I: LongWord; S: Int64; begin S := 0; for I := 0 to _N-1 do begin Inc(V[0], ((V[1] shl 4) xor (V[1] shr 5)) + (V[1] xor S) + K[S and 3]); Inc(S, _DELTA); Inc(V[1], ((V[0] shl 4) xor (V[0] shr 5)) + (V[0] xor S) + K[(S shr 11) and 3]); end; end; procedure XTea_Bloc_Decrypt(var V: TTeaBuffer; const K: TTeaKey); var I: LongWord; S: Int64; begin S := _DELTA * Int64(_N); for I := 0 to _N-1 do begin Dec(V[1], ((V[0] shl 4) xor (V[0] shr 5)) + (V[0] xor S) + K[(S shr 11) and 3]); Dec(S, _DELTA); Dec(V[0], ((V[1] shl 4) xor (V[1] shr 5)) + (V[1] xor S) + K[S and 3]); end; end; procedure XTea_Crypt(const Buffer, Key; const BufferSize, KeySize : integer; var Dest: pBytes); var pB, pK : pArByte; V: TTeaBuffer; K: TTeaKey; I, L, N: Integer; begin pB := pArByte(Buffer); pK := pArByte(Key); L := KeySize; if L > SizeOfTeaKey then L := SizeOfTeaKey; K[0] := 0; K[1] := 0; K[2] := 0; K[3] := 0; Move(pK^[0], K[0], L); I := 1; L := BufferSize; if L > 0 then SetLength(Dest^, ((L-1) div SizeOfTeaBuffer+1) * SizeOfTeaBuffer) else exit; while I <= L do begin V[0] := 0; V[1] := 0; N := L - I + 1; if N > SizeOfTeaBuffer then N := SizeOfTeaBuffer; Move(pB^[I], V[0], N); XTea_Bloc_Crypt(V, K); Move(V[0], Dest^[I], SizeOfTeaBuffer); Inc(I, SizeOfTeaBuffer); end; end; procedure XTea_Decrypt(const Buffer, Key; const BufferSize, KeySize : integer; var Dest: pBytes); var pB, pK : pArByte; V: TTeaBuffer; K: TTeaKey; I, L, N: Integer; begin pB := pArByte(Buffer); pK := pArByte(Key); L := KeySize; if L > SizeOfTeaKey then L := SizeOfTeaKey; K[0] := 0; K[1] := 0; K[2] := 0; K[3] := 0; Move(pK^[0], K[0], L); I := 1; L := BufferSize; if L > 0 then SetLength(Dest^, ((L-1) div SizeOfTeaBuffer+1) * SizeOfTeaBuffer) else exit; while I <= L do begin V[0] := 0; V[1] := 0; N := L - I + 1; if N > SizeOfTeaBuffer then N := SizeOfTeaBuffer; Move(pB^[I], V[0], N); XTea_Bloc_Decrypt(V, K); Move(V[0], Dest^[I], SizeOfTeaBuffer); Inc(I, SizeOf(V)) end; end; function XTea_Crypt_Str(const Buffer, Key: AnsiString): AnsiString; var V: TTeaBuffer; K: TTeaKey; I, L, N: Integer; begin L := Length(Key); if L > SizeOfTeaKey then L := SizeOfTeaKey; K[0] := 0; K[1] := 0; K[2] := 0; K[3] := 0; Move(Key[1], K[0], L); I := 1; L := Length(Buffer); if L > 0 then SetLength(Result, ((L-1) div SizeOfTeaBuffer+1) * SizeOfTeaBuffer) else SetLength(Result, 0); while I <= L do begin V[0] := 0; V[1] := 0; N := L - I + 1; if N > SizeOfTeaBuffer then N := SizeOfTeaBuffer; Move(Buffer[I], V[0], N); XTea_Bloc_Crypt(V, K); Move(V[0], Result[I], SizeOfTeaBuffer); Inc(I, SizeOfTeaBuffer); end; end; function XTea_Decrypt_Str(const Buffer, Key: AnsiString): AnsiString; var V: TTeaBuffer; K: TTeaKey; I, L, N: Integer; begin L := Length(Key); if L > SizeOfTeaKey then L := SizeOfTeaKey; K[0] := 0; K[1] := 0; K[2] := 0; K[3] := 0; Move(Key[1], K[0], L); I := 1; L := Length(Buffer); if L > 0 then SetLength(Result, ((L-1) div SizeOfTeaBuffer+1) * SizeOfTeaBuffer) else SetLength(Result, 0); while I <= L do begin V[0] := 0; V[1] := 0; N := L - I + 1; if N > SizeOfTeaBuffer then N := SizeOfTeaBuffer; Move(Buffer[I], V[0], N); XTea_Bloc_Decrypt(V, K); Move(V[0], Result[I], SizeOfTeaBuffer); Inc(I, SizeOfTeaBuffer) end; end; end.