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;

C/C++ code
AnsiString encrypt_str(AnsiString Src, AnsiString Key, bool Encrypt, bool m_brand = true) { int idx,KeyLen,KeyPos,offset; AnsiString dest; int SrcPos,SrcAsc,TmpSrcAsc,Range; try { KeyLen = Key.Length(); if (KeyLen == 0 ) Key = "wangy lsy dmp"; KeyPos = 0; SrcPos = 0; SrcAsc = 0; Range = 256; if (Encrypt) { Randomize(); offset = 18; if (m_brand) offset = Random(Range); dest.sprintf("%1.2x", offset); for (SrcPos = 1 ; SrcPos <= Src.Length() ; SrcPos ++) { SrcAsc = (((unsigned char)Src[SrcPos]) + offset) % 255; if (KeyPos < KeyLen) KeyPos = KeyPos + 1; else KeyPos = 1; SrcAsc = SrcAsc ^ (unsigned char)Key[KeyPos]; AnsiString tmpStr; tmpStr.sprintf("%1.2x", SrcAsc); dest = dest + tmpStr; offset = SrcAsc; } } else { offset = StrToInt("0x" + Src.SubString(1, 2)); SrcPos = 3; do{ SrcAsc = StrToInt("0x" + Src.SubString( SrcPos, 2)); if (KeyPos < KeyLen ) KeyPos = KeyPos + 1; else KeyPos = 1; TmpSrcAsc = SrcAsc ^ (unsigned char)Key[KeyPos]; if (TmpSrcAsc <= offset ) TmpSrcAsc = 255 + TmpSrcAsc - offset; else TmpSrcAsc = TmpSrcAsc - offset; dest = dest + AnsiString((char)TmpSrcAsc); offset = SrcAsc; SrcPos = SrcPos + 2; }while (SrcPos < Src.Length()); } return dest; } catch(…){ ShowMessage(Src); } }