function UnCrypKey(Src: string; Key: string): string;
var
  KeyLen: Integer;
  KeyPos: Integer;
  offset: Integer;
  SrcPos: Integer;
  SrcAsc: Integer;
  TmpSrcAsc: Integer;
  dest: string;
begin
  TmpSrcAsc := 0;
  KeyPos := 0;
  KeyLen := Length(Key);
  offset := StrToInt('$' + Copy(Src, 1, 2));    //转化成16进制整形数
  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);
  Result := dest;
end;

解决方案 »

  1.   

    string UnCrypKey(string src, string key) {
        int keyLen;
        int keyPos;
        int offset;
        int srcPos;
        int srcAsc;
        int tmpSrcAsc;
        string dest;    tmpSrcAsc = 0;
        keyPos = 0;
        keyLen = key.Length;
        offset = int.Parse(src.Substring(0, 2), NumberStyles.HexNumber);
        srcPos = 2;
        dest = "";    do 
        {
            srcAsc = int.Parse(src.Substring(srcPos, 2), NumberStyles.HexNumber);
            if (keyPos < keyLen) 
                keyPos++;
            else
                keyPos = 1;
            tmpSrcAsc = srcAsc ^ (int)key[keyPos]; 
            if(tmpSrcAsc < offset)
                tmpSrcAsc = 255 + tmpSrcAsc - offset;
            else 
                tmpSrcAsc -= offset;
            dest += (char)tmpSrcAsc;
            offset = srcAsc;
            srcPos =+ 2;
        } while(srcPos < src.Length);
        return dest;
    }