如题

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1081/1081792.xml?temp=.8103449
      

  2.   

    直接加密和解密算法{*******************************************************}
    {                                                       }
    {  Decrypt                                              }
    {                                                       }
    {  bitwise compare of each characters XOR 27            }
    {                                                       }
    {  Return string which after bitwise compare            }
    {                                                       }
    {*******************************************************}
    function Decrypt(s: string; Key: Integer = 27): string;
    var
      i: Integer;
    begin
      Result := s;
      for i := 1 to Length(s) do
        Result[i] := Chr(Ord(s[i]) xor Key);
    end;{*******************************************************}
    {                                                       }
    {  Encrypt                                              }
    {                                                       }
    {  Call again Decrypt to back to origin                 }
    {                                                       }
    {  Return string which after bitwise compare            }
    {                                                       }
    {*******************************************************}
    function Encrypt(s: string; Key : Integer =27): string;
    begin
      Result := Decrypt(s, Key);
    end;
      

  3.   

    下面是我收藏的DELPHI版的des算法资料,你可以参考参考
    unit des32;interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs;
    {$H-}
    type
      TActionType = (Encryption,Decryption);
      TEncryption = class(TComponent)
      private
        { Private declarations }
        FInputString: string;
        FOutputString: string;
        FHexInputString: string;
        FHexOutputString: string;
        FKeyString: string;
        FAction: TActionType;
        FOutputLength: Word;
        Procedure DES (Var Input; Var Output; Var Key; Encrypt : Boolean);
        function BinaryToHexStr(input:string):String;
        function HexStrToBinary(input:string):String;
        procedure SetInputString(input:string);
        procedure SetHexInputString(input:string);
        procedure SetOutputString(input:string);
        procedure SetHexOutputString(input:string);
        procedure SetKeyString(input:string);
        function StrNPas(input:PChar;Leng:integer):string;
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent);override;
        Procedure Execute;
      published
        { Published declarations }
        property Input: String read FInputString write SetInputString;
        property Output: String read FOutputString write SetOutputString;
        property HexInput: String read FHexInputString write SetHexInputString;
        property HexOutput: String read FHexOutputString write SetHexOutputString;
        property Key: String read FKeyString write SetKeyString;
        property Action: TActionType read FAction write FAction;
        property OutputLength: Word read FOutputLength write FOutputLength;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TEncryption]);
    end;constructor TEncryption.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Key := 'Delphi32';
      FOutputLength := 8;
    end;function TEncryption.BinaryToHexStr(input:string):String;
    var
      idx : integer;
      OutStr : String;
    begin
      OutStr:='';
      for idx:=1 to length(input) do
        OutStr := OutStr+intToHex(ord(input[idx]),2);  BinaryToHexStr := OutStr;
    end;function TEncryption.HexStrToBinary(input:string):String;
    var
      idx, cnt : integer;
      OutStr : String;
    begin
      cnt := length(input) div 2;
      for idx:=1 to cnt do
        OutStr[idx] := chr(StrToint('$'+Copy(input,idx*2-1,2)));  OutStr[0]      := chr(cnt);
      HexStrToBinary := OutStr;
    end;procedure TEncryption.SetHexOutputString(input:string);
    begin
      FHexOutputString := input;
      FOutputString    := HexStrToBinary(FHexOutputString);
    end;procedure TEncryption.SetOutputString(input:string);
    begin
      FOutputString    := input;
      FHexOutputString := BinaryToHexStr(FOutputString);
    end;procedure TEncryption.SetHexInputString(input:string);
    begin
      if Length(input)>254 then
      begin
        MessageDlg('HexInput String Length Must Less 255 Character.',mtInformation,[mbOk],0);
        exit;
      end;
      FHexInputString := input;
      FInputString    := HexStrToBinary(FHexInputString);
    end;procedure TEncryption.SetKeyString(input:string);
    begin
      if length(input)>8 then
      begin
        MessageDlg('Key String Length Must Less 9 Character.',mtInformation,[mbOk],0);
        exit;
      end;
      FKeyString := input;
    end;procedure TEncryption.SetInputString(input:string);
    var
      leng:integer;
    begin
      if length(input)>127 then
      begin
        MessageDlg('Input String Length Must Less 127 Character.',mtInformation,[mbOk],0);
        exit;
      end;
      FInputString    := input;
      FHexInputString := BinaryToHexStr(FInputString);
    end;function TEncryption.StrNPas(input:PChar;Leng:integer):string;
    var
      idx:integer;
      output:string;
    begin
      for idx:=1 to Leng do
        output[idx] := input[idx-1];
      output[0] := chr(Leng);
      StrNPas   := output;
    end;Procedure TEncryption.DES (Var Input; Var Output; Var Key; Encrypt : Boolean);
      

  4.   

    Const
      IP : Array [1..64] Of Byte = (58,50,42,34,26,18,10,2,
                                    60,52,44,36,28,20,12,4,
                                    62,54,46,38,30,22,14,6,
                                    64,56,48,40,32,24,16,8,
                                    57,49,41,33,25,17, 9,1,
                                    59,51,43,35,27,19,11,3,
                                    61,53,45,37,29,21,13,5,
                                    63,55,47,39,31,23,15,7);
      InvIP : Array [1..64] Of Byte = (40, 8,48,16,56,24,64,32,
                                       39, 7,47,15,55,23,63,31,
                                       38, 6,46,14,54,22,62,30,
                                       37, 5,45,13,53,21,61,29,
                                       36, 4,44,12,52,20,60,28,
                                       35, 3,43,11,51,19,59,27,
                                       34, 2,42,10,50,18,58,26,
                                       33, 1,41, 9,49,17,57,25);
      E : Array [1..48] Of Byte = (32, 1, 2, 3, 4, 5,
                                    4, 5, 6, 7, 8, 9,
                                    8, 9,10,11,12,13,
                                   12,13,14,15,16,17,
                                   16,17,18,19,20,21,
                                   20,21,22,23,24,25,
                                   24,25,26,27,28,29,
                                   28,29,30,31,32, 1);
      P : Array [1..32] Of Byte = (16, 7,20,21,
                                   29,12,28,17,
                                    1,15,23,26,
                                    5,18,31,10,
                                    2, 8,24,14,
                                   32,27, 3, 9,
                                   19,13,30, 6,
                                   22,11, 4,25);
      SBoxes : Array [1..8,0..3,0..15] Of Byte =
               (((14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7),
                 ( 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8),
                 ( 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0),
                 (15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13)),            ((15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10),
                 ( 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5),
                 ( 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15),
                 (13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9)),            ((10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8),
                 (13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1),
                 (13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7),
                 ( 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12)),            (( 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15),
                 (13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9),
                 (10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4),
                 ( 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14)),            (( 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9),
                 (14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6),
                 ( 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14),
                 (11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3)),            ((12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11),
                 (10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8),
                 ( 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6),
                 ( 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13)),            (( 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1),
                 (13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6),
                 ( 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2),
                 ( 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12)),            ((13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7),
                 ( 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2),
                 ( 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8),
                 ( 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11)));  PC_1 : Array [1..56] Of Byte = (57,49,41,33,25,17, 9,
                                       1,58,50,42,34,26,18,
                                      10, 2,59,51,43,35,27,
                                      19,11, 3,60,52,44,36,
                                      63,55,47,39,31,23,15,
                                       7,62,54,46,38,30,22,
                                      14, 6,61,53,45,37,29,
                                      21,13, 5,28,20,12, 4);  PC_2 : Array [1..48] Of Byte = (14,17,11,24, 1, 5,
                                       3,28,15, 6,21,19,
                                      23,19,12, 4,26, 8,
                                      16, 7,27,20,13, 2,
                                      41,52,31,37,47,55,
                                      30,40,51,45,33,48,
                                      44,49,39,56,34,53,
                                      46,42,50,36,29,32);  ShiftTable : Array [1..16] Of Byte = (1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1);Var
      InputValue : Array [1..64] Of Byte;
      OutputValue : Array [1..64] Of Byte;
      RoundKeys : Array [1..16,1..48] Of Byte;
      L, R, FunctionResult : Array [1..32] Of Byte;
      C, D : Array [1..28] Of Byte;Function GetBit (Var Data; Index : Byte) : Byte;Var
      Bits : Array [0..7] Of Byte ABSOLUTE Data;Begin
      Dec (Index);
      If Bits[Index DIV 8] And (128 SHR (Index MOD 8))>0 then
         GetBit:=1
      Else
         GetBit:=0;
    End;Procedure SetBit (Var Data; Index, Value : Byte);Var
      Bits : Array [0..7] Of Byte ABSOLUTE Data;
      Bit : Byte;
    Begin
      Dec (Index);
      Bit:=128 SHR (Index MOD 8);
      Case Value Of
        0 : Bits[Index DIV 8]:=Bits[Index DIV 8] And (Not Bit);
        1 : Bits[Index DIV 8]:=Bits[Index DIV 8] Or Bit;
      End;
    End;Procedure F (Var FR, FK, Output);
    Var
      R : Array [1..48] Of Byte ABSOLUTE FR;
      K : Array [1..48] Of Byte ABSOLUTE FK;
      Temp1 : Array [1..48] Of Byte;
      Temp2 : Array [1..32] Of Byte;
      n, h, i, j, Row, Column : Integer;
      TotalOut : Array [1..32] Of Byte ABSOLUTE Output;
    Begin
      For n:=1 to 48 Do Temp1[n]:=R[E[n]] Xor K[n];
      For n:=1 to 8 Do Begin
        i:=(n-1)*6;
        j:=(n-1)*4;
        Row:=Temp1[i+1]*2+Temp1[i+6];
        Column:=Temp1[i+2]*8 + Temp1[i+3]*4 + Temp1[i+4]*2 + Temp1[i+5];
        For h:=1 to 4 Do Begin
          Case h Of
            1 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 8) DIV 8;
            2 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 4) DIV 4;
            3 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 2) DIV 2;
            4 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 1);
          End;
        End;
      End;
      For n:=1 to 32 Do TotalOut[n]:=Temp2[P[n]];
    End;Procedure Shift (Var SubKeyPart);Var
      SKP : Array [1..28] Of Byte ABSOLUTE SubKeyPart;
      n, b : Byte;
    Begin
      b:=SKP[1];
      For n:=1 to 27 Do SKP[n]:=SKP[n+1];
      SKP[28]:=b;
    End;
      

  5.   

    Procedure SubKey (Round : Byte; Var SubKey);Var
      SK : Array [1..48] Of Byte ABSOLUTE SubKey;
      n, b : Byte;
    Begin
      For n:=1 to ShiftTable[Round] Do Begin
        Shift (C);
        Shift (D);
      End;
      For n:=1 to 48 Do Begin
        b:=PC_2[n];
        If b<=28 then SK[n]:=C[b] Else SK[n]:=D[b-28];
      End;
    End;Var
      n, i, b, Round : Byte;
      Outputje : Array [1..64] Of Byte;
      K : Array [1..48] Of Byte;
      fi : Text;
    Begin
      For n:=1 to 64 Do InputValue[n]:=GetBit (Input,n);
      For n:=1 to 28 Do Begin
        C[n]:=GetBit(Key,PC_1[n]);
        D[n]:=GetBit(Key,PC_1[n+28]);
      End;
      For n:=1 to 16 Do
        SubKey (n,RoundKeys[n]);  For n:=1 to 64 Do
        If n<=32 then
           L[n]:=InputValue[IP[n]]
        Else
           R[n-32]:=InputValue[IP[n]];  For Round:=1 to 16 Do Begin
        If Encrypt then
          F (R,RoundKeys[Round],FunctionResult)
        Else
          F (R,RoundKeys[17-Round],FunctionResult);    For n:=1 to 32 Do
          FunctionResult[n] := FunctionResult[n] Xor L[n];    L:=R;
        R:=FunctionResult;
      End;
      For n:=1 to 64 Do Begin
        b:=InvIP[n];
        If b<=32 then OutputValue[n]:=R[b] Else OutputValue[n]:=L[b-32];
      End;
      For n:=1 to 64 Do SetBit (Output,n,OutputValue[n]);
    End;procedure TEncryption.Execute;
    var
      EncryptionFlag:boolean;
      tmpInputStr,tmpOutputStr,tmpKey:Array [0..8] of Char;
      Leng,idx,LoopDiv,LoopMod:integer;
      tmpStr: string;
    begin
      FOutputString:='';
      Leng := length(FKeyString);
      if Leng=0 then
      begin
        FKeyString:='Delphi30';
        Leng:=8;
      end;
      LoopDiv:=Leng div 8;
      if LoopDiv=1 then
         StrPcopy(tmpKey,FKeyString)
      else
      begin
         LoopMod := Leng mod 8;
         For idx := 1 to LoopMod do
           tmpKey[idx-1] := FKeyString[idx];     For idx := LoopMod+1 to 8 do
           tmpKey[idx-1] := chr(0);
      end;     Leng := length(FInputString);
         LoopMod := Leng mod 8;
         LoopDiv := Leng div 8;     EncryptionFlag := False;
         if FAction = Encryption then
            EncryptionFlag := True;     For idx:=1 to LoopDiv do
         begin
           tmpStr := copy(FInputString,(idx-1)*8+1,8);
           Move(tmpStr[1], tmpInputStr, 8);
           Des(tmpInputStr,tmpOutputStr,tmpKey,EncryptionFlag);
           FOutputString:=FOutputString+StrNPas(tmpOutputStr,8);
         end;     if LoopMod>0 then
         begin
           For idx:=1 to LoopMod do
             tmpInputStr[idx-1] := FInputString[LoopDiv*8+idx];       For idx:=LoopMod+1 to 8 do
             tmpInputStr[idx-1] := chr(0);       Des(tmpInputStr,tmpOutputStr,tmpKey,EncryptionFlag);
           FOutputString := FOutputString+StrNPas(tmpOutputStr,8);
         end;
         if FOutputLength > 0 then
            if Length(FOutputString) > FOutputLength then
               FOutputString := Copy(FOutputString, Length(FOutputString)-FOutputLength+1, FOutputLength);
               
         FHexOutputString := BinaryToHexStr(FOutputString);
    end;end.
      

  6.   

    给出原理如何实现DES算法原文:Matthew Fischer翻译:小榕软件实验室DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。DES算法以被应用于许多需要安全加密的场合。(如:UNIX的密码算法就是以DES算法为基础的)。下面是关于如何实现DES算法的语言性描述,如果您要其源代码,可以到Http//Assassin.yeah.net下载,后者您有任何问题也可以写信给我([email protected])。1-1、变换密钥取得64位的密钥,每个第8位作为奇偶校验位。1-2、变换密钥。1-2-1、舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。Permuted Choice 1 (PC-1)57 49 41 33 25 17 91 58 50 42 34 26 1810 2 59 51 43 35 2719 11 3 60 52 44 3663 55 47 39 31 23 157 62 54 46 38 30 2214 6 61 53 45 37 2921 13 5 28 20 12 41-2-2、将变换后的密钥分为两个部分,开始的28位称为C[0],最后的28位称为D[0]。1-2-3、生成16个子密钥,初始I=1。1-2-3-1、同时将C[I]、D[I]左移1位或2位,根据I值决定左移的位数。见下表I: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16左移位数: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 11-2-3-2、将C[I]D[I]作为一个整体按下表(PC-2)变换,得到48位的K[I] Permuted Choice 2 (PC-2)14 17 11 24 1 53 28 15 6 21 1023 19 12 4 26 816 7 27 20 13 241 52 31 37 47 5530 40 51 45 33 4844 49 39 56 34 5346 42 50 36 29 321-2-3-3、从1-2-3-1处循环执行,直到K[16]被计算完成。 2、处理64位的数据2-1、取得64位的数据,如果数据长度不足64位,应该将其扩展为64位(例如补零)2-2、将64位数据按下表变换(IP)Initial Permutation (IP)58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 72-3、将变换后的数据分为两部分,开始的32位称为L[0],最后的32位称为R[0]。2-4、用16个子密钥加密数据,初始I=1。2-4-1、将32位的R[I-1]按下表(E)扩展为48位的E[I-1]Expansion (E)32 1 2 3 4 54 5 6 7 8 98 9 10 11 12 1312 13 14 15 16 1716 17 18 19 20 2120 21 22 23 24 2524 25 26 27 28 2928 29 30 31 32 12-4-2、异或E[I-1]和K[I],即E[I-1] XOR K[I]2-4-3、将异或后的结果分为8个6位长的部分,第1位到第6位称为B[1],第7位到第12位称为B[2],依此类推,第43位到第48位称为B[8]。2-4-4、按S表变换所有的B[J],初始J=1。所有在S表的值都被当作4位长度处理。2-4-4-1、将B[J]的第1位和第6位组合为一个2位长度的变量M,M作为在S[J]中的行号。2-4-4-2、将B[J]的第2位到第5位组合,作为一个4位长度的变量N,N作为在S[J]中的列号。2-4-4-3、用S[J][M][N]来取代B[J]。Substitution Box 1 (S[1])14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 70 15 7 4 14 2 13 1 10 6 12 11 9 5 3 84 1 14 8 13 6 2 11 15 12 9 7 3 10 5 015 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13S[2]15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 103 13 4 7 15 2 8 14 12 0 1 10 6 9 11 50 14 7 11 10 4 13 1 5 8 12 6 9 3 2 1513 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9S[3]10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 813 7 0 9 3 4 6 10 2 8 5 14 12 11 15 113 6 4 9 8 15 3 0 11 1 2 12 5 10 14 71 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12S[4]7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 1513 8 11 5 6 15 0 3 4 7 2 12 1 10 14 910 6 9 0 12 11 7 13 15 1 3 14 5 2 8 43 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14S[5]2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 914 11 2 12 4 7 13 1 5 0 15 10 3 9 8 64 2 1 11 10 13 7 8 15 9 12 5 6 3 0 1411 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3S[6]12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 1110 15 4 2 7 12 9 5 6 1 13 14 0 11 3 89 14 15 5 2 8 12 3 7 0 4 10 1 13 11 64 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13S[7]4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 113 0 11 7 4 9 1 10 14 3 5 12 2 15 8 61 4 11 13 12 3 7 14 10 15 6 8 0 5 9 26 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12S[8]13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 71 15 13 8 10 3 7 4 12 5 6 11 0 14 9 27 11 4 1 9 12 14 2 0 6 10 13 15 3 5 82 1 14 7 4 10 8 13 15 12 9 0 3 5 6 112-4-4-4、从2-4-4-1处循环执行,直到B[8]被替代完成。2-4-4-5、将B[1]到B[8]组合,按下表(P)变换,得到P。Permutation P16 7 20 2129 12 28 171 15 23 265 18 31 102 8 24 1432 27 3 919 13 30 622 11 4 252-4-6、异或P和L[I-1]结果放在R[I],即R[I]=P XOR L[I-1]。2-4-7、L[I]=R[I-1]2-4-8、从2-4-1处开始循环执行,直到K[16]被变换完成。2-4-5、组合变换后的R[16]L[16](注意:R作为开始的32位),按下表(IP-1)变换得到最后的结果。Final Permutation (IP**-1)40 8 48 16 56 24 64 3239 7 47 15 55 23 63 3138 6 46 14 54 22 62 3037 5 45 13 53 21 61 2936 4 44 12 52 20 60 2835 3 43 11 51 19 59 2734 2 42 10 50 18 58 2633 1 41 9 49 17 57 25以上就是DES算法的描述。