⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqtea.pas

📁 application with delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    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 + -