大致要求是这样的:
1、可以加密和解密
2、要有密钥在里面
3、最好是修改了加密后字符串里的任意字符(除了尾部)都只能解密出乱码
4、如果是好的代码,重谢+追分

解决方案 »

  1.   


    function EncrypStr(Src, Key: String): String;//字符串加密函数  
    //对字符串加密(Src:源 Key:密匙)
    var KeyLen :Integer;
        KeyPos :Integer;
        offset :Integer;
        dest :string;
        SrcPos :Integer;
        SrcAsc :Integer;
        Range :Integer;
    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(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;
       Result:=Dest;
    end;
    end;function UncrypStr(Src, Key: String): string;//字符串解密函数  
    //对字符串解密(Src:源 Key:密匙)
    var KeyLen :Integer;
        KeyPos :Integer;
        offset :Integer;
        dest :string;
        SrcPos :Integer;
        SrcAsc :Integer;
        TmpSrcAsc :Integer;
    begin
       KeyLen:=Length(Key);
       if KeyLen = 0 then key:='delphi';
       KeyPos:=0;
       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);
       Result:=Dest;
    end;//********************************************************
    //             加密解密 (利用异或运算)    (方式2)           
    //********************************************************function encryptstr(const s:string; skey:string):string;//加密
    var
        i,j: integer;
        hexS,hexskey,midS,tmpstr:string;
        a,b,c:byte;
    begin
        hexS   :=myStrtoHex(s);
        hexskey:=myStrtoHex(skey);
        midS   :=hexS;
        for i:=1 to (length(hexskey) div 2)   do
        begin
            if i<>1 then midS:= tmpstr;
            tmpstr:='';
            for j:=1 to (length(midS) div 2) do
            begin
                a:=strtoint('$'+midS[2*j-1]+midS[2*j]);
                b:=strtoint('$'+hexskey[2*i-1]+hexskey[2*i]);
                c:=a xor b;
                tmpstr := tmpstr+myStrtoHex(chr(c));
            end;
        end;
        result := tmpstr;
    end;function decryptstr(const s:string; skey:string):string;//解密
    var
        i,j: integer;
        hexS,hexskey,midS,tmpstr:string;
        a,b,c:byte;
    begin
        hexS  :=s;//应该是该字符串
        if length(hexS) mod 2=1 then
        begin
            showmessage('密文错误!');
            exit;
        end;
        hexskey:=myStrtoHex(skey);
        tmpstr :=hexS;
        midS   :=hexS;
        for i:=(length(hexskey) div 2) downto 1 do
        begin
            if i<>(length(hexskey) div 2) then midS:= tmpstr;
            tmpstr:='';
            for j:=1 to (length(midS) div 2) do
            begin
                a:=strtoint('$'+midS[2*j-1]+midS[2*j]);
                b:=strtoint('$'+hexskey[2*i-1]+hexskey[2*i]);
                c:=a xor b;
                tmpstr := tmpstr+myStrtoHex(chr(c));
            end;
        end;
        result := myHextoStr(tmpstr);
    end;
      

  2.   

    function EncrypKey (Src:String; Key:String):string;
    var
      //idx :integer;
      KeyLen :Integer;
      KeyPos :Integer;
      offset :Integer;
      dest :string;
      SrcPos :Integer;
      SrcAsc :Integer;
      //TmpSrcAsc :Integer;
      Range :Integer;
    begin
      KeyLen:=Length(Key);
      if KeyLen = 0 then
        key:='csdn';
      KeyPos:=0;
      //SrcPos:=0;
      //SrcAsc:=0;
      Range:=256;
      Randomize;
      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;
      Result:=Dest;
    end;function UncrypKey (Src:String; Key:String):string;
    var
      //idx :integer;
      KeyLen :Integer;
      KeyPos :Integer;
      offset :Integer;
      dest :string;
      SrcPos :Integer;
      SrcAsc :Integer;
      TmpSrcAsc :Integer;
      //Range :Integer;
    begin
      KeyLen:=Length(Key);
      if KeyLen = 0 then
        key:='csdn';
      KeyPos:=0;
      //SrcPos:=0;
      //SrcAsc:=0;
      //Range:=256;
      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);
      Result:=Dest;
    end;
    这个行不?
      

  3.   

    AES或者DES算法就行了,有现成的代码
      

  4.   

    AES和DES
    修改加密后内容的一两个字符依然可以解密出大部分字符串
    我这里有个易语言的源码,可以在修改一两个字符后解密出乱码
    下载地址:http://yus.ys168.com
      

  5.   

    AES能解密出来?你不告诉别人你的密钥,他能解出来?那他真成神仙了……
      

  6.   

    你说修改密文中的任意字符解密出来的是乱码,那就是别人要已知你的密钥才可以这样做。密钥都知道了好像没有必要加密了吧?按你的要求来说,要可以加密解密用对称算法的话,密钥就是主要的,也可以采用基于大素数的算法RSA等,公钥加密,私钥解密。
    总的一句话来说,就是你说的问题不是很清楚。