有很多种方法,据一些简单的方法如下:
明文:abcdef,密钥:C(自己定义一个)
abcdef每一位和C异或-->结果(密文)
(密文)每一位和C异或-->结果(明文:abcdef)明文:abcdef通过移n位,后得到密文
abcdef-->左移1位-->密文bcdefg
密文bcdefg-->右移1位-->明文abcdef也可把这些多种简单的方法结合在一起成为一个复杂的方法。

解决方案 »

  1.   

    下面是一个利用用户名和密码原文生成的加密程序:
    这里面没有固定的密钥,加密使用username和password
    function encryptpassword(username:string;password:string):string;
    var beforepassword,afterpassword:string;
        i,j,k,len:integer;
        order:integer;
    begin
         beforepassword:=username+password;
         afterpassword:='';
         len:=length(beforepassword);
         if len = 0 then
              afterpassword:='passwordnil'
         else
         begin
              j:=0;
              for i:=1 to len do
              begin
                   j:=j+ord(beforepassword[i])+i;
              end;
              K:=round(j/len);
              if len < 10 then
              begin
                   for i:=1 to len do
                   begin
                        j:=ord(beforepassword[i]);
                        if j < k then
                        begin
                             order:=(j+k+i)mod 128;
                             if order < 60 then order:=order+60;
                             if order>100 then order:=order-40;
                             afterpassword:=afterpassword + char(order);
                             order:=(k-j+i)mod 128;
                             if order < 60 then order:=order+60;
                             if order>100 then order:=order-40;
                             afterpassword:=afterpassword + char(order);
                        end
                        else
                        begin
                             order:=(j+k+i)mod 128;
                             if order < 60 then order:=order+60;
                             if order>100 then order:=order-40;
                             afterpassword:=afterpassword + char(order);
                             order:=(j-k+i) mod 128;
                             if order < 60 then order:=order+60;
                             if order>100 then order:=order-40;
                             afterpassword:=afterpassword + char(order);
                        end;
                   end;
              end
              else
              begin
                   for i:=1 to len do
                   begin
                        order:=ord(beforepassword[i]);
                        order:=order mod 128;
                        if order < 60 then order:=order+60;
                        if order>100 then order:=order-40;
                        afterpassword:=afterpassword + char(order);
                  end;
              end;
         end;     encryptpassword:=afterpassword;
    end;
      

  2.   

    Ymxxm谢谢各位,
    我希望:'12k中华民族'-->'密文'-->'12k中华民族'(解密后能够正常显示为原来的文字)
      

  3.   

    那是当然。方法有很多。最简单最快的是利用一个key字串先按照某种固定方法生成key运算子,然后用它去对原文的各个字节作xor位运算。解密过程同加密。如:function GetXORKey(key: string): DWORD;
    var
      i: integer;
    begin
      Result:=$12345678;  // magic starter
      for i:=1 to Length(key) do
      begin
        Result:=Result+ ord(key[i]) shl i;
      end;
    end;function ToggleText(var text: string; key: DWORD): string;
    var
      i: integer;
      subKey: array [0..3] of byte;
    begin
      CopyMemory(@subKey,@key,sizeof(key));
      for i:=1 to length(text) do
      begin
        text[i]:=chr(ord(text[i]) xor subKey[i mod 4]);
      end;
    end;procedure Test;
    var
      s: string;
    begin
      s:='test text';
      ToggleText(s,GetXORKey('JGTM2000'));
      ShowMessage(s);  // 看看变成什么模样了
      ToggleText(s,GetXORKey('JGTM2000')); // 如果不是JGTM2000就不一定对了
      ShowMessage(s);  // 回来了吧!
    end;容易吧(而且效率相当高)?关键是这里的GetXORKey,要是能对不同的密码字串尽量不生成相同的Key效果更好(那样密码不一样肯定不对,比如可以用32bit CRC算法),我只是随手一写,仅作示意。当然,根据的你的保密要求的不同要具体情况具体分析的。
      

  4.   

    字符串加密解密函数,可以直接使用//加密函数
    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:='Think Space';
    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:='Think Space';
    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;
      

  5.   

    Ymxxm再次谢谢各位,现已将分送上。