function Encrypt(tsStr : String; tnSafecode:Integer):String;
var
  i,l : Integer  ;
  ii,ll : Integer  ;
  aEncode : Array of Char ;
begin
  ll := 128 ;
  setlength(aEncode,ll);
  ii := 0 ;
  for i := 0  to ll - 1 do
  begin
    case i of
      0..32: ;
      34,39: ;
      250..255 : ;
    else ;
       aEncode[ii] := chr(i);
       ii := ii +1
    end;
  end;
  SetLength(aEncode,ii);
  Result := '';
  tsStr:=tsStr+'********************';
  tsStr := copy(tsStr,1,20);
  l := Length(tsStr);
  for i := 1 to l  do
  begin
    tnSafecode := tnSafecode + i;
    Result := Result + aEncode[(Integer(tsStr[i])* tnSafecode * tnSafecode ) mod ii];
  end;
end;
这是加密函数,哪位大侠写一下解密的函数。

解决方案 »

  1.   

    ii = 92
    用92个符号表示256个可能,而且前后没有联系,这将导致反推得到多个结果.
    f(x) = y; x->y , y->x1,x2,x3...得到多个x.
    随便提一下,这函数效率很低..
      

  2.   

    程序动态生成一个密码表,内容是固定的(Integer(tsStr[i])* tnSafecode * tnSafecode ) = 被除数
    ii 是 93 吧,也就是除数
    余数可以通过加密后的字符来查表获得,也就是该字符在密码表中的索引然后就开始推商吧,1..2..3..4...除以tnSafecode得到的结果<=255的话就行了
    所以这里的字符串一定要是AnsiString类型的
      

  3.   

    ii确实是93.
    假设 tnSafecode =1 , tsStr[1] = #1 或者 #94 或者 #187
    得到的结果: 索引都是1,Result[1] = aEncode[1] = #35
    解码的时候,#35解码后到底是 #1还是#94还是#187?
    一位有2种或者3种可能,20位总共有多少个结果? 2^20至2^30种可能,这个