📄 qqtea.pas
字号:
Result[3] := tmpArray[0];
Result[4] := tmpArray[7];
Result[5] := tmpArray[6];
Result[6] := tmpArray[5];
Result[7] := tmpArray[4];
end;
Function QQDecipher(arrayIn,arrayKey:array of Byte;offset:Integer=0):TEncBuff;
var
I,y,z,a,b,c,d:Longint;
sum,delta :Longint;
tmpArray :Array [0..23] of Byte;
tmpOut :Array [0..7] of Byte;
begin
If High(arrayIn) < 7 Then Exit ;
If High(arrayKey) < 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 := UnsignedDel(z,(UnsignedAdd(LShift(Y, 4), c) Xor UnsignedAdd(Y, sum) Xor UnsignedAdd(RShift(Y, 5), d)));
z := z And $FFFFFFFF;
Y := UnsignedDel(Y, (UnsignedAdd(LShift(z, 4), a) Xor UnsignedAdd(z, sum) Xor UnsignedAdd(RShift(z, 5), b)));
Y := Y And $FFFFFFFF ;
sum := UnsignedDel(sum, delta);
sum := sum And $FFFFFFFF;
end;
CopyMemory(@tmpArray[0],@Y, 4);
CopyMemory(@tmpArray[4],@z, 4);
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];
CopyMemory(@Result[0],@tmpOut[0], 8);
end;
procedure Encrypt8Bytes;
var
Crypted:TEncBuff;
I :Integer;
begin
For i :=0 To 7 do
begin
If Header Then
Plain[i] := Plain[i] Xor prePlain[i]
Else
Plain[i] := Plain[i] Xor OutKey[preCrypt + i];
end;
//**
Crypted := QQEncipher(Plain,Key,0);
For I := 0 To 7 do OutKey[Crypt + I] := Crypted[I];
For i :=0 To 7 do OutKey[Crypt + i] := OutKey[Crypt + i] Xor prePlain[i];
//prePlain := Plain;
CopyMemory(@PrePlain[0],@Plain[0],8);
preCrypt := Crypt;
Crypt := Crypt + 8;
Pos := 0;
Header := False
end;
Function Decrypt8Bytes(arrayIn:array of byte;offset:Integer):Boolean;
var
i:integer;
begin
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;
try
//**
prePlain := QQDecipher(prePlain, Key);
except
Result := False;
Exit;
end;
contextStart := contextStart + 8;
Crypt := Crypt + 8;
Pos := 0;
Result:= True;
end;
Function QQEncrypt(arrayIn,arrayKey :array of byte;var BufLen:integer;offset:Integer):TQQBuff;
var
i:integer;
nLen :integer;
begin
Pos :=1;
Crypt :=0;
preCrypt := 0;
nLen :=High(arrayin)+1;
SetLength(Key,High(arrayKey)+1);
ZeroMemory(@Key[0],Length(Key));
CopyMemory(@Key[0], @arrayKey[0],High(arrayKey)+1);
Header := True ;
Pos := (nLen+ 10) Mod 8;
If Pos <> 0 Then Pos := 8-Pos;
BufLen :=nLen + Pos + 10;
For i:=0 to 499 do
begin
OutKey[i]:=0;
prePlain[i]:=0;
Plain[i]:=0;
end;
Plain[0] := (Rand And $F8) Or Pos;
For I := 1 To Pos do Plain[I] := Rand And $FF;
For I := 0 To 7 do prePlain[i] :=$0;
Pos := Pos + 1;
padding := 1;
While padding < 3 do
begin
If Pos < 8 Then
begin
Plain[Pos] := Rand And $FF;
padding := padding + 1 ;
Pos := Pos + 1 ;
end else if Pos = 8 Then Encrypt8Bytes;
end;
I := offset; // 头部填充完了,这里开始填真正的明文了,也是满了8字节就加密,一直到明文读完
While nLen > 0 do
begin
If Pos < 8 Then
begin
Plain[Pos] := arrayIn[I];
I := I + 1;
Pos := Pos + 1;
nLen := nLen - 1;
end else if Pos = 8 Then Encrypt8Bytes
end;
padding := 1; // 最后填上0,以保证是8字节的倍数
While padding < 9 do
begin
If Pos < 8 Then
begin
Plain[Pos] := $0;
Pos := Pos + 1;
padding := padding + 1
end else If Pos = 8 Then Encrypt8Bytes
end;
SetLength(Result,BufLen);
CopyMemory(@Result[0],@OutKey[0], BufLen);
end;
Function QQDecrypt(arrayIn,arrayKey :array of byte;var BufLen:Integer;offset:Integer):TQQBuff;
var
m:array of byte;
I:Integer;
Count:Integer;
nLen:integer;
begin
If (High(arrayIn) < 15) Or (((High(arrayIn)+1) Mod 8) <> 0) Then Exit ;
SetLength(m,offset + 8);
SetLength(Key,16);
CopyMemory(@Key[0], @arrayKey[0],16);
Crypt := 0;
preCrypt := 0;
BufLen:=0;
prePlain := QQDecipher(arrayIn, arrayKey, offset);
Pos := prePlain[0] And $7;
Count:= High(arrayIn)- Pos - 8;
nLen := High(arrayIn)- Pos - 8;
If Count < 0 Then Exit ;
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 If Pos = 8 Then
begin
SetLength(m,high(arrayIn)+1);
CopyMemory(@m[0], @arrayIn[0], High(m)+ 1);
If not Decrypt8Bytes(arrayIn, offset) Then Exit;
end;
end;
I := 0;
While Count <> 0 do
begin
If Pos < 8 Then
begin
OutKey[I] := m[offset + preCrypt + Pos] Xor prePlain[Pos];
I := I + 1 ;
Count := Count - 1;
Pos := Pos + 1;
end Else 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, offset) Then Exit ;
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 If Pos = 8 Then
begin
CopyMemory(@m[0], @arrayIn[0], High(m) + 1);
preCrypt := Crypt;
If not Decrypt8Bytes(arrayIn, offset) Then Exit;
end;
end;
BufLen:=nLen;
SetLength(Result,nLen);
CopyMemory(@Result[0],@OutKey[0],nLen);
end;
initialization
Class_Initialize;
{$WARNINGS ON}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -