因要对大量文本进行简单变换存储,开始是用Xor,发现对中文处理不如人意,某些汉字Xor后在内存中操作无问题,存成文本后则无法显示出来,用论坛中消失在人海的DES加密,可以正确显示,但是加密解密太慢了

解决方案 »

  1.   

    安全要求高的话就得牺牲速度,哈,我以前写的那个DES。
      

  2.   

    Function EncryptDecrypt(S : String;K:String):String;
    Var
      I,Q:Integer;
      O:String[255];
    begin
      Q := 1;
      O := '';
      For I := 1 to Length(S) Do
        begin
          O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
          Inc(Q); If Q > Length(K) Then Q := 1;
        end;
      EncryptDecrypt := O;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      Edit2.Text:=EncryptDecrypt(Edit1.Text,'111');
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      Edit3.Text:=EncryptDecrypt(Edit2.Text,'111');
    end;你用这个函数吧,又可以加密又可以解密。
      

  3.   

    Function EncryptDecrypt(S : String;K:String):String;
    Var
      I,Q:Integer;
      O:String[255];
    begin
      Q := 1;
      O := '';
      For I := 1 to Length(S) Do
        begin
          O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
          Inc(Q); If Q > Length(K) Then Q := 1;
        end;
      EncryptDecrypt := O;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      Edit2.Text:=EncryptDecrypt(Edit1.Text,'111');
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      Edit3.Text:=EncryptDecrypt(Edit2.Text,'111');
    end;你用这个函数吧,又可以加密又可以解密。
      

  4.   

    to ksaiy(真爱不是取代,而是心中永恒的存在) 你上面贴出来的可能不行哦, 不过现在也没办法试,用来写程序的电脑挂了,有些字符Xor后会表示为?的形式,在内存中可以正确解开,但是存储为文件后就不行了
      

  5.   

    Function EncryptDecrypt(S : String;K:String):String;解释一下就是S是你要加密或解密的字符,K是KEY,加密/解密时要用同一个KEY。
      

  6.   

    http://community.csdn.net/Expert/topic/3557/3557236.xml?temp=.1817285
      

  7.   

    to  ksaiy(真爱不是取代,而是心中永恒的存在) 
        随便取几篇文章,加密后保存,然后读取解密,如果无异则成功(最好大小无较大改变)不好意思,要你帮忙测试,这破电脑,这时候挂了
      

  8.   

    要保存文件才能发现问题,在内存中操作无问题
    比如说用 “件” xor 1然后保存成文本文件,再 Xor 1 看看
      

  9.   

    to ksaiy(真爱不是取代,而是心中永恒的存在) 测试了,这个函数不行,对中文进行变换的时候,只加密了前面一部份,应该是遇到某个字符后就停止加密退出了Function EncryptDecrypt(S : String;K:String):String;
    Var
      I,Q:Integer;
      O:String[255];
    begin
      Q := 1;
      O := '';
      For I := 1 to Length(S) Do
        begin
          O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
          Inc(Q); If Q > Length(K) Then Q := 1;
        end;
      EncryptDecrypt := O;
    end;
      

  10.   

    你的加密如果只是哄一般用户的,用Base64就可以了。function TGlobalOptions.Base64Decode(s: string): string;
    var
      Decoder: TIdBase64Decoder;
    begin
      Decoder := TIdBase64Decoder.Create(nil);
      try
        Decoder.CodeString(s);
        s := Decoder.CompletedInput;
        delete(s, 1, 2);
        result := s;
      finally
        Decoder.Free;
      end;
    end;function TGlobalOptions.Base64Encode(s: string): string;
    var
      Encoder: TIdBase64Encoder;
    begin
      Encoder := TIdBase64Encoder.Create(nil);
      try
        Encoder.CodeString(s);
        s := Encoder.CompletedInput;
        delete(s, 1, 2);
        result := s;
      finally
        Encoder.Free;
      end;
    end;
      

  11.   

    delphi 里面 ElAES加密用过吗,由于太长,不能贴出来,需要的我给你Email过去
      

  12.   

    To Sorder
         呵呵,没用过,谢谢 [email protected]
    To zeroxing(光头) 
        TIdBase64Decoder  三方控件吗?
      

  13.   

    我这里有aes的加密,从网上down的,有兴趣可以给你看看。
    要的话,请留e-mail
      

  14.   

    [email protected]地址在上面试过Base64编码,但是文件增大有三倍左右,
      

  15.   

    Function RotateBits(C: Char; Bits: Integer): Char;
    var
      SI : Word;
    begin
      Bits := Bits mod 8;
      if Bits < 0 then
        begin
          SI := MakeWord(Byte(C),0);
          SI := SI shl Abs(Bits);
        end
      else
        begin
          SI := MakeWord(0,Byte(C));
          SI := SI shr Abs(Bits);
        end;
      SI := Swap(SI);
      SI := Lo(SI) or Hi(SI);
      Result := Chr(SI);
    end;Function Encrypt(EnStr,Key: String; Encode: Boolean): String;
    var
      a,PwdChk,Direction,ShiftVal,PasswordDigit : Integer;
    begin
      PasswordDigit := 1;
      PwdChk := 0;
      for a := 1 to Length(Key) do Inc(PwdChk,Ord(Key[a]));
      Result := EnStr;
      if Encode then Direction := -1 else Direction := 1;
      for a := 1 to Length(Result) do
        begin
          if Length(Key)=0 then
            ShiftVal := a
          else
            ShiftVal := Ord(Key[PasswordDigit]);
          if Odd(A) then
            Result[A] := RotateBits(Result[A],-Direction*(ShiftVal+PwdChk))
          else
            Result[A] := RotateBits(Result[A],Direction*(ShiftVal+PwdChk));
          inc(PasswordDigit);
          if PasswordDigit > Length(Key) then PasswordDigit := 1;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //加密调用
      Edit2.Text:=Encrypt(Edit1.Text,'123',True);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      //解密调用
      Edit3.Text:=Encrypt(Edit2.Text,'123',False);
    end;Function Encrypt(EnStr,Key: String; Encode: Boolean): String;
    说明一下,EnStr为要加密或者是解密的字符串,Encode表示,如果为TRUE的时候代表加密,为False的时候代表解密。
      

  16.   

    我要一份,谢谢 ! [email protected]
      

  17.   

    To ksaiy(真爱不是取代,而是心中永恒的存在)谢谢你不厌其烦的帮助,问题仍然无法解决在内存中操作无误,但是保存为文件后再解密就大部份为乱码,
    测试如下
    加密
      Memo2.Text :=  Encrypt(Memo1.Text,'123',True);
      Memo2.Lines.SaveToFile('c:\aaa.txt');解密:    Memo2.Text :=  Encrypt(Memo1.Text,'123',False);其中Memo1.Text为c:\aaa.txt的数据大部份为乱码
      

  18.   

    怀疑你在把文件导到Memo1的时候出了问题。
    memo的目的是用来显示的,内部处理就用字符串吧。
      

  19.   

    To zeroxing(光头) 无论如何,用来加密解密的字符串都是要存储并显示给用户的,如果只在内存中操作倒是没有任何问题
      

  20.   

    先加密,将加密数据再用上面的base64算法转换,解密时重复这两步,base64可以把字符限制转换为可见字符
      

  21.   

    以下的加密,也只是骗骗一般用户,多次测试,没什么问题unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Memo2: TMemo;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        function decodestr(s: string; key1: integer): string;
        function encodestr(s: string; key1: integer): string;
        { Private declarations }
      public    { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm} function TForm1.encodestr(s : string; key1 : integer ):string;
    var i : integer;
        s1 : string;
    begin
     s1:=s;
     for i:=1 to strlen(pchar(s)) do
     begin
     s1[i]:=char(ord(s[i])+key1);
     end;
    result:=s1;
    end;function TForm1.decodestr(s : string; key1 : integer):string;
    var i : integer;
        s1 : string;
    begin
     s1:=s;
     for i:=1 to strlen(pchar(s)) do
     begin
     s1[i]:=char(ord(s[i])-key1);
     end;
    result:=s1;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
       Memo2.Text :=  encodestr(Memo1.Text,20);
       memo2.Lines.SaveToFile('c:\test.txt');
    end;
    procedure TForm1.Button4Click(Sender: TObject);
    begin
     memo2.Lines.LoadFromFile('c:\test.txt');
    Memo1.Text :=  decodestr(Memo2.Text,20);
    end;end.
      

  22.   

    显示的时候做BASE64或者转换成16进制,楼上朋友已经说了的。
      

  23.   

    我按照你的意思测试了一下,这个可以,其实上面的也可以,你只要改一下就出来了。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Button2: TButton;
        Edit3: TEdit;
        Memo1: TMemo;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function Crypt(const s: string; Key: Word; const bEncrypt: boolean = True): string; overload;
    type
      TDynByteArray = array of byte;
    const
      SeedA = 5678;
      SeedB = 5432;
    var
      i : integer;
      ps, pr : ^byte;
    begin
      SetLength(Result, Length(s));
      ps := @s[1];
      pr := @Result[1];
      for i := 1 to length(s) do
        begin
          pr^ := ps^ xor (Key shr 8);
          if bEncrypt then
            Key := (pr^ + Key) * SeedA + SeedB
          else
           Key := (ps^ + Key) * SeedA + SeedB;
          pr := pointer(integer(pr) + 1);
          ps := pointer(integer(ps) + 1);
    end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo2.Text := Crypt(Memo1.Text,123,True);
      Memo2.Lines.SaveToFile('c:\aaa.txt');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Memo2.Text := Crypt(Memo1.Text,123,False);
    end;end.