function encrypt_str(Src: string; Key: string; Encrypt: Boolean; m_brand: boolean = true): string; 
var 
  idx: integer; 
  KeyLen: Integer; 
  KeyPos: Integer; 
  offset: Integer; 
  dest: string; 
  SrcPos: Integer; 
  SrcAsc: Integer; 
  TmpSrcAsc: Integer; 
  Range: Integer; 
begin 
  try 
      KeyLen := Length(Key); 
      if KeyLen = 0 then key := 'wangy lsy dmp'; 
      KeyPos := 0; 
      SrcPos := 0; 
      SrcAsc := 0; 
      Range := 256; 
      if Encrypt then 
        begin 
            Randomize; 
            offset := 18; 
            if m_brand then 
              offset := Random(Range); 
            dest := format('%1.2x', [offset]); 
            for SrcPos := 1 to Length(Src) do 
              begin 
                  SrcAsc := (Ord(Src[SrcPos]) + offset) mod 255; 
                  if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1; 
                  SrcAsc := SrcAsc xor Ord(Key[KeyPos]); 
                  dest := dest + format('%1.2x', [SrcAsc]); 
                  offset := SrcAsc; 
              end; 
        end 
      else 
        begin 
            offset := StrToInt('$' + copy(src, 1, 2)); 
            SrcPos := 3; 
            repeat 
              SrcAsc := StrToInt('$' + copy(src, SrcPos, 2)); 
              if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1; 
              TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]); 
              if TmpSrcAsc <= offset then 
                  TmpSrcAsc := 255 + TmpSrcAsc - offset 
              else 
                  TmpSrcAsc := TmpSrcAsc - offset; 
              dest := dest + chr(TmpSrcAsc); 
              offset := srcAsc; 
              SrcPos := SrcPos + 2; 
            until SrcPos >= Length(Src); 
        end; 
      Result := Dest; 
  except 
      showmessage(src); 
  end; 
end;