function EncryptString(Source:String;bEncrypt:Boolean=True; Key: String='delphi'):string;//加密解密字符串,加密后得字符串为16进制
//对字符串加密(Source:源 Key:密匙)
//对字符串解密(Src:源 Key:密匙)   加密得字符串如果没有解密时会报错
var KeyLen :Integer;
    KeyPos :Integer;
    offset :Integer;
    dest :string;
    SrcPos :Integer;
    SrcAsc :Integer;
    Range :Integer;
    TmpSrcAsc :Integer;
begin
  if bEncrypt then
  begin
    KeyLen:=Length(Key);
    if KeyLen = 0 then key:='delphi';
    KeyPos:=0;
    Range:=256;
    Randomize;
    offset:=Random(Range);
    dest:=format('%1.2x',[offset]);
    for SrcPos := 1 to Length(Source) do
    begin
      SrcAsc:=(Ord(Source[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;
    Result:=Dest;
  end
  else
  begin
    if Length(Source)<3 then
    begin
      Result:='';
      Exit;
    end;
    KeyLen:=Length(Key);
    if KeyLen = 0 then key:='delphi';
    KeyPos:=0;
    offset:=StrToInt('$'+ copy(Source,1,2));
    SrcPos:=3;
    repeat
    SrcAsc:=StrToInt('$'+ copy(Source,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(Source);
    Result:=Dest;
  end;
end;
逻辑已经清楚,但是我解析有问题?delphi没接触过不是特别明白!
这是我写的 C#的有问题!

 private string Decress(string strpwd)
        {
            string result = string.Empty;
            string key = "delphi";
            int offset = 0;
            int srcpos = 0;
            int srcasc = 0;
            int keypos = 0;
            int rempsrcasc = 0;
            if (strpwd.Length < 3)
            {
                result = string.Empty;
            }
            else
            {
                //F0461D3CA
                offset = Convert.ToInt32("0x" + strpwd.Substring(0, 2), 16);
                srcpos = 3;
                do
                {
                    srcasc = Convert.ToInt32("0x" + strpwd.Substring(srcpos - 1, 2), 16);
                    if (keypos < key.Length)
                        keypos += 1;
                    else
                        keypos = 1;
                    rempsrcasc = srcasc ^ (int)key[keypos];
                    if (rempsrcasc <= offset)
                        rempsrcasc = 255 + rempsrcasc - offset;
                    else
                        rempsrcasc -= offset;
                    result += Chr(rempsrcasc);
                    offset = srcasc;
                    srcpos += 2;                } while (srcpos < strpwd.Length);
            }
            return result;        }

解决方案 »

  1.   

    SrcAsc:=StrToInt('$'+ copy(Source,SrcPos,2));
    问下 Source="FDA"时 copy(Source,3,2)delphi会有异常吗?
      

  2.   

     Source="FDA"时 
    copy(Source,3,2)指从source的第三个开始连续取两个
    你这个结果第三个字符是A,不可能取两个啊
      

  3.   


    所以我问有没有异常,有的话 那delphi是如何处理的?
      

  4.   


    就是解密不对,
    Source="FDA"时 
    copy(Source,3,2)——》 C# Source.SubString(2,2)肯定异常这里delphi是如何处理的
    我不明白……
      

  5.   

    没有搞懂,楼主到底是Delphi转C#?,还是C#l转Delphi?
      

  6.   

     已经很清楚了……
    莫非要转到delphi去问?
      

  7.   

     已经很清楚了……
    莫非要转到delphi去问?
      

  8.   


    你不会连substring也忘了怎么用了吧
    这个跟delphi的copy不一样的
    Source.SubString(2,2)是指从“A”开始取两个,必定出错啊
      

  9.   

    晕……
    copy(Source,3,2)从第3位开始取2位
    C#中的Source.SubString(2,2)也是从第3位开始取2位
      

  10.   

    不会异常,copy(Source,3,2)输出为‘A’字符
      

  11.   

    所以楼主你用C#翻译过来的时候自己要先判断strpwd长度分开处理
    如果strpwd长度为奇数,就循环到srcpos < strpwd.Length-1,最后一个字符单独处理;如果strpwd长度为偶数,那就照正常情况处理
      

  12.   


    看20层回复,DELPHI没问题,但是C#不能判断处理
      

  13.   

    弄明白了  rempsrcasc = srcasc ^ (int)key[keypos];
    keypos是delphi的索引是1开始的 这里改成keypos-1就OK了