或者其他加密算法?或者能够从一串输入字符串单射生成另一字符串的函数

解决方案 »

  1.   

    一个简单的字符串映射m,s: String;s[1] := m[1];
    s[n] := m[n-1] xor m[n] xor n;
      

  2.   

    我有,
    unit Md5;interfaceuses SysUtils, Classes, Controls;Const
      S11 = 7;
      S12 = 12;
      S13 = 17;
      S14 = 22;
      S21 = 5;
      S22 = 9;
      S23 = 14;
      S24 = 20;
      S31 = 4;
      S32 = 11;
      S33 = 16;
      S34 = 23;
      S41 = 6;
      S42 = 10;
      S43 = 15;
      S44 = 21;type
      TSourceType = (SourceFile, SourceByteArray, SourceString);
      ULONG32 = record
        LoWord16: WORD;
        HiWord16: WORD;
      end;
      PULONG32 = ^ULONG32;
      PLong = ^LongInt;
      hashDigest = record
        A: Longint;
        B: Longint;
        C: Longint;
        D: Longint;
      end;
      PTR_Hash = ^hashDigest;  TMd5 = class(TComponent)
        private
          FType : TSourceType;
          FInputFilePath: String;
          FInputArray: PByte;
          FOutputDigest: PTR_Hash;
          FSourceLength: LongInt;
          FActiveBlock: Array[0..15] of LongInt;
          FA, FB, FC, FD, FAA, FBB, FCC, FDD: LongInt;
          FpA, FpB, FpC, FpD: PLong;
          procedure FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
          procedure GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
          Procedure HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
          procedure II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
        protected
          { Protected declarations }
        public
          { Public declarations }
          procedure Md5_Initialize;
          procedure Md5_Transform;
          procedure Md5_Hash_Bytes;
          procedure Md5_Hash_File;
          function Md5_Hash(ss: String): String;
          property pInputArray: PByte read FInputArray write FInputArray;
          property pOutputArray: PTR_Hash read FOutputDigest write FOutputDigest;{!!See FOutputArray}
          property InputFilePath: String read FInputFilePath write FInputFilePath;
          property InputLength: LongInt read FSourceLength write FSourceLength;
        published
          property InputType: TSourceType read FType write FType;
      end;  procedure Register;
    implementationfunction ROL(A: Longint; Amount: BYTE): Longint; Assembler;
    asm
      mov cl, Amount
      rol eax, cl
    end;
    procedure Register;
    begin
      RegisterComponents('Standard', [TMd5]);
    end;procedure TMd5.Md5_Initialize;
    var
      a, b, c, d: LongInt;
    begin
      a := $67452301; b:=$efcdab89; c:=$98badcfe; d:=$10325476;
      Move(a, FA, 4); FpA := @FA;
      Move(b, FB, 4); FpB := @FB;
      Move(c, FC, 4); FpC := @FC;
      Move(d, FD, 4); FpD := @FD;
    end;procedure TMd5.FF(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
    var
      Fret: LongInt;
    begin
      Fret := ((PLong(b)^) And (PLong(c)^)) Or ((Not(PLong(b)^)) And (PLong(d)^));
      PLong(a)^ := PLong(a)^ + Fret + PLong(x)^ + ac;
      LongInt(a^):= ROL(LongInt(a^), s);
      Inc(PLong(a)^, PLong(b)^);
    end;procedure TMd5.GG(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
    var
      Gret: LongInt;
    begin
      Gret := (PLong(b)^ And PLong(d)^) Or ( PLong(c)^ And (Not PLong(d)^));
      PLong(a)^ := PLong(a)^ + Gret + PLong(x)^ + ac;
      LongInt(a^):= ROL(LongInt(a^), s);
      Inc(PLong(a)^, PLong(b)^);
    end;procedure TMd5.HH(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
    var
      Hret: LongInt;
    begin
      Hret := PLong(b)^ Xor PLong(c)^ Xor PLong(d)^;
      PLong(a)^ := PLong(a)^ + Hret + PLong(x)^ + ac;
      LongInt(a^):= ROL(LongInt(a^), s);
      PLong(a)^ := PLong(b)^ + PLong(a)^;
    end;procedure TMd5.II(a, b, c, d, x: Pointer; s: BYTE; ac: Longint);
    var
      Iret: LongInt;
    begin
      Iret := (PLong(c)^ Xor (PLong(b)^ Or (Not PLong(d)^)));
      PLong(a)^ := PLong(a)^ + Iret + PLong(x)^ + ac;
      LongInt(a^):= ROL(PLong(a)^, s );
      PLong(a)^ := PLong(b)^ + PLong(a)^;
    end;procedure TMd5.Md5_Transform;
    begin
      FAA := FA;
      FBB := FB;
      FCC := FC;
      FDD := FD;
      FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S11, $d76aa478);
      FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 1], S12, $e8c7b756);
      FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S13, $242070db);
      FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 3], S14, $c1bdceee);
      FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S11, $f57c0faf);
      FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 5], S12, $4787c62a);
      FF (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S13, $a8304613);
      FF (FpB, FpC, FpD, FpA, @FActiveBlock[ 7], S14, $fd469501);
      FF (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S11, $698098d8);
      FF (FpD, FpA, FpB, FpC, @FActiveBlock[ 9], S12, $8b44f7af);
      FF (FpC, FpD, FpA, FpB, @FActiveBlock[10], S13, $ffff5bb1);
      FF (FpB, FpC, FpD, FpA, @FActiveBlock[11], S14, $895cd7be);
      FF (FpA, FpB, FpC, FpD, @FActiveBlock[12], S11, $6b901122);
      FF (FpD, FpA, FpB, FpC, @FActiveBlock[13], S12, $fd987193);
      FF (FpC, FpD, FpA, FpB, @FActiveBlock[14], S13, $a679438e);
      FF (FpB, FpC, FpD, FpA, @FActiveBlock[15], S14, $49b40821);
      GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S21, $f61e2562);
      GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 6], S22, $c040b340);
      GG (FpC, FpD, FpA, FpB, @FActiveBlock[11], S23, $265e5a51);
      GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 0], S24, $e9b6c7aa);
      GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S21, $d62f105d);
      GG (FpD, FpA, FpB, FpC, @FActiveBlock[10], S22,  $2441453);
      GG (FpC, FpD, FpA, FpB, @FActiveBlock[15], S23, $d8a1e681);
      GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 4], S24, $e7d3fbc8);
      GG (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S21, $21e1cde6);
      GG (FpD, FpA, FpB, FpC, @FActiveBlock[14], S22, $c33707d6);
      GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S23, $f4d50d87);
      GG (FpB, FpC, FpD, FpA, @FActiveBlock[ 8], S24, $455a14ed);
      GG (FpA, FpB, FpC, FpD, @FActiveBlock[13], S21, $a9e3e905);
      GG (FpD, FpA, FpB, FpC, @FActiveBlock[ 2], S22, $fcefa3f8);
      GG (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S23, $676f02d9);
      GG (FpB, FpC, FpD, FpA, @FActiveBlock[12], S24, $8d2a4c8a);
      HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 5], S31, $fffa3942);
      HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 8], S32, $8771f681);
      HH (FpC, FpD, FpA, FpB, @FActiveBlock[11], S33, $6d9d6122);
      HH (FpB, FpC, FpD, FpA, @FActiveBlock[14], S34, $fde5380c);
      HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 1], S31, $a4beea44);
      HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 4], S32, $4bdecfa9);
      HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 7], S33, $f6bb4b60);
      HH (FpB, FpC, FpD, FpA, @FActiveBlock[10], S34, $bebfbc70);
      HH (FpA, FpB, FpC, FpD, @FActiveBlock[13], S31, $289b7ec6);
      HH (FpD, FpA, FpB, FpC, @FActiveBlock[ 0], S32, $eaa127fa);
      HH (FpC, FpD, FpA, FpB, @FActiveBlock[ 3], S33, $d4ef3085);
      HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 6], S34,  $4881d05);
      HH (FpA, FpB, FpC, FpD, @FActiveBlock[ 9], S31, $d9d4d039);
      HH (FpD, FpA, FpB, FpC, @FActiveBlock[12], S32, $e6db99e5);
      HH (FpC, FpD, FpA, FpB, @FActiveBlock[15], S33, $1fa27cf8);
      HH (FpB, FpC, FpD, FpA, @FActiveBlock[ 2], S34, $c4ac5665);
      II (FpA, FpB, FpC, FpD, @FActiveBlock[ 0], S41, $f4292244);
      II (FpD, FpA, FpB, FpC, @FActiveBlock[ 7], S42, $432aff97);
      II (FpC, FpD, FpA, FpB, @FActiveBlock[14], S43, $ab9423a7);
      II (FpB, FpC, FpD, FpA, @FActiveBlock[ 5], S44, $fc93a039);
      II (FpA, FpB, FpC, FpD, @FActiveBlock[12], S41, $655b59c3);
      II (FpD, FpA, FpB, FpC, @FActiveBlock[ 3], S42, $8f0ccc92);
      II (FpC, FpD, FpA, FpB, @FActiveBlock[10], S43, $ffeff47d);
      II (FpB, FpC, FpD, FpA, @FActiveBlock[ 1], S44, $85845dd1);
      II (FpA, FpB, FpC, FpD, @FActiveBlock[ 8], S41, $6fa87e4f);
      II (FpD, FpA, FpB, FpC, @FActiveBlock[15], S42, $fe2ce6e0);
      II (FpC, FpD, FpA, FpB, @FActiveBlock[ 6], S43, $a3014314);
      II (FpB, FpC, FpD, FpA, @FActiveBlock[13], S44, $4e0811a1);
      II (FpA, FpB, FpC, FpD, @FActiveBlock[ 4], S41, $f7537e82);
      II (FpD, FpA, FpB, FpC, @FActiveBlock[11], S42, $bd3af235);
      II (FpC, FpD, FpA, FpB, @FActiveBlock[ 2], S43, $2ad7d2bb);
      II (FpB, FpC, FpD, FpA, @FActiveBlock[ 9], S44, $eb86d391);
      Inc(FA, FAA);
      Inc(FB, FBB);
      Inc(FC, FCC);
      Inc(FD, FDD);
      FillChar(FActiveBlock, SizeOf(FActiveBlock), #0);
    end;
      

  3.   

    function TMd5.Md5_Hash(ss: String): String;
    var
      pStr: PChar;
      i: Integer;
      outblock: hashDigest;
      outarray: array[0..15] of char absolute outblock;
    begin
      pOutputArray:= @outblock;
      Md5_Initialize;
      case FType of
        SourceFile: Md5_Hash_File;
        SourceByteArray: Md5_Hash_Bytes;
        SourceString: begin
          pStr := StrAlloc(Length(ss) + 1);
          try
            StrPCopy(pStr, ss);
            FSourceLength := Length(ss);
            FInputArray := Pointer(pStr);
            Md5_Hash_Bytes;
          finally
            StrDispose(pStr);
          end;
        end;
      end;
      FOutputDigest^.A := LongInt(FpA^);
      FOutputDigest^.B := LongInt(FpB^);
      FOutputDigest^.C := LongInt(FpC^);
      FOutputDigest^.D := LongInt(FpD^);
      for i:= 0 to length(outarray)-1 do Result := Result + LowerCase(IntToHex(Byte(outarray[i]),2));
    end;procedure TMd5.Md5_Hash_Bytes;
    var
      Buffer: array[0..4159] of Byte;
      Count64: Comp;
      index: longInt;
    begin
      Move(FInputArray^, Buffer, FSourceLength);
      Count64 := FSourceLength * 8;
      Buffer[FSourceLength] := $80;
      inc(FSourceLength);
      while (FSourceLength mod 64)<>56 do begin
        Buffer[FSourceLength] := 0;
        Inc(FSourceLength);
      end;
      Move(Count64,Buffer[FSourceLength],SizeOf(Count64));
      index := 0;
      Inc(FSourceLength, 8);
      repeat
        Move(Buffer[Index], FActiveBlock, 64);
        Md5_Transform;
        Inc(Index,64);
      until Index = FSourceLength;
    end;procedure TMd5.Md5_Hash_File;
    var
      Buffer:array[0..4159] of BYTE;
      InputFile: File;
      Count64: Comp;
      DoneFile : Boolean;
      Index: LongInt;
      NumRead: integer;
    begin
      DoneFile := False;
      AssignFile(InputFile, FInputFilePath);
      Reset(InputFile, 1);
      Count64 := 0;
      repeat
        BlockRead(InputFile,Buffer,4096,NumRead);
        Count64 := Count64 + NumRead;
        if NumRead<>4096 then begin
          Buffer[NumRead]:= $80;
          Inc(NumRead);
          while (NumRead mod 64)<>56 do begin
            Buffer[ NumRead ] := 0;
            Inc(NumRead);
          end;
          Count64 := Count64 * 8;
          Move(Count64,Buffer[NumRead],8);
          Inc(NumRead,8);
          DoneFile := True;
        end;
        Index := 0;
        repeat
          Move(Buffer[Index], FActiveBlock, 64);
          Md5_Transform;
          Inc(Index,64);
        until Index = NumRead;
      until DoneFile;
      CloseFile(InputFile);
    end;
    end.
      

  4.   

    为什么执行时,提示
    pOutputArray:= @outblock;
    错误