AsphyreMD5.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:11k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreMD5;
  2. //---------------------------------------------------------------------------
  3. // AsphyreMD5.pas                                       Modified: 17-Oct-2005
  4. // MD5 Message-Digest Algorithm                                   Version 1.0
  5. //---------------------------------------------------------------------------
  6. // This unit was originally written by Matthias Fichtner, 1999 and has been
  7. // adapted by Afterwarp Interactive to be compatible with the rest of the
  8. // library.
  9. //
  10. // NOTICE: The license statement mentioned below applies *ONLY* to this file
  11. // and is not related in any way to Afterwarp Interactive or Asphyre library!
  12. //---------------------------------------------------------------------------
  13. // RSA Data Security, Inc., MD5 message-digest algorithm
  14. //
  15. // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
  16. // rights reserved.
  17. //
  18. // License to copy and use this software is granted provided that it
  19. // is identified as the "RSA Data Security, Inc. MD5 Message-Digest
  20. // Algorithm" in all material mentioning or referencing this software
  21. // or this function.
  22. //
  23. // License is also granted to make and use derivative works provided
  24. // that such works are identified as "derived from the RSA Data
  25. // Security, Inc. MD5 Message-Digest Algorithm" in all material
  26. // mentioning or referencing the derived work.
  27. //
  28. // RSA Data Security, Inc. makes no representations concerning either
  29. // the merchantability of this software or the suitability of this
  30. // software for any particular purpose. It is provided "as is"
  31. // without express or implied warranty of any kind.
  32. //
  33. // These notices must be retained in any copies of any part of this
  34. // documentation and/or software.
  35. //---------------------------------------------------------------------------
  36. interface
  37. //---------------------------------------------------------------------------
  38. uses
  39.  SysUtils;
  40. //---------------------------------------------------------------------------
  41. type
  42.  MD5Block    = array[0..15] of Longword;
  43.  MD5CBits    = array[0..7] of byte;
  44.  TMD5State   = array[0..3] of Longword;
  45.  TMD5Digest  = array[0..15] of Byte;
  46.  TMD5Buffer  = array[0..63] of Byte;
  47.  TMD5Context = record
  48.   State : TMD5State;
  49.   Count : array[0..1] of Longword;
  50.   Buffer: TMD5Buffer;
  51.  end;
  52. //---------------------------------------------------------------------------
  53. procedure MD5Init(out Context: TMD5Context);
  54. procedure MD5Update(var Context: TMD5Context; Source: Pointer; Size: Longword);
  55. procedure MD5Final(var Context: TMD5Context; out Digest: TMD5Digest);
  56. //---------------------------------------------------------------------------
  57. // MD5Checksum()
  58. //
  59. // Returns MD5 128-bit checksum based on supplied memory block. The checksum
  60. // occupies 16 bytes of memory.
  61. //---------------------------------------------------------------------------
  62. procedure MD5Checksum(Source: Pointer; Size: Integer; Checksum: Pointer);
  63. //---------------------------------------------------------------------------
  64. implementation
  65. //---------------------------------------------------------------------------
  66. {$R-}
  67. {$Q-}
  68. //---------------------------------------------------------------------------
  69. var
  70.  Padding: TMD5Buffer = ($80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
  71.   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
  72.   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
  73.   $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
  74.   $00, $00, $00, $00, $00, $00, $00, $00);
  75. //---------------------------------------------------------------------------
  76. function F(x, y, z: Longword): Longword;
  77. begin
  78.  Result:= (x and y) or ((not x) and z);
  79. end;
  80. //---------------------------------------------------------------------------
  81. function G(x, y, z: Longword): Longword;
  82. begin
  83.  Result:= (x and z) or (y and (not z));
  84. end;
  85. //---------------------------------------------------------------------------
  86. function H(x, y, z: Longword): Longword;
  87. begin
  88.  Result:= x xor y xor z;
  89. end;
  90. //---------------------------------------------------------------------------
  91. function I(x, y, z: Longword): Longword;
  92. begin
  93.  Result:= y xor (x or (not z));
  94. end;
  95. //---------------------------------------------------------------------------
  96. procedure Rot(var x: Longword; n: Byte);
  97. begin
  98.  x:= (x shl n) or (x shr (32 - n));
  99. end;
  100. //---------------------------------------------------------------------------
  101. procedure FF(var a: Longword; b, c, d, x: Longword; s: Byte; ac: Longword);
  102. begin
  103.  Inc(a, F(b, c, d) + x + ac);
  104.  Rot(a, s);
  105.  Inc(a, b);
  106. end;
  107. //---------------------------------------------------------------------------
  108. procedure GG(var a: Longword; b, c, d, x: Longword; s: Byte; ac: Longword);
  109. begin
  110.  Inc(a, G(b, c, d) + x + ac);
  111.  Rot(a, s);
  112.  Inc(a, b);
  113. end;
  114. //---------------------------------------------------------------------------
  115. procedure HH(var a: Longword; b, c, d, x: Longword; s: Byte; ac: Longword);
  116. begin
  117.  Inc(a, H(b, c, d) + x + ac);
  118.  Rot(a, s);
  119.  Inc(a, b);
  120. end;
  121. //---------------------------------------------------------------------------
  122. procedure II(var a: Longword; b, c, d, x: Longword; s: Byte; ac: Longword);
  123. begin
  124.  Inc(a, I(b, c, d) + x + ac);
  125.  Rot(a, s);
  126.  Inc(a, b);
  127. end;
  128. //---------------------------------------------------------------------------
  129. procedure Encode(Source, Target: Pointer; Count: Longword);
  130. var
  131.  S: PByte;
  132.  T: PLongword;
  133.  i: Longword;
  134. begin
  135.  S:= Source;
  136.  T:= Target;
  137.  for i:= 0 to (Count div 4) - 1 do
  138.   begin
  139.    T^:= S^;
  140.    Inc(S);
  141.    T^:= T^ or (S^ shl 8);
  142.    Inc(S);
  143.    T^:= T^ or (S^ shl 16);
  144.    Inc(S);
  145.    T^:= T^ or (S^ shl 24);
  146.    Inc(S);
  147.    Inc(T);
  148.   end;
  149. end;
  150. //---------------------------------------------------------------------------
  151. procedure Decode(Source, Target: Pointer; Count: Longword);
  152. var
  153.  S: PLongword;
  154.  T: PByte;
  155.  i: Longword;
  156. begin
  157.  S:= Source;
  158.  T:= Target;
  159.  for i:= 0 to Count - 1 do
  160.   begin
  161.    T^:= S^ and $FF;
  162.    Inc(T);
  163.    T^:= (S^ shr 8) and $FF;
  164.    Inc(T);
  165.    T^:= (S^ shr 16) and $FF;
  166.    Inc(T);
  167.    T^:= (S^ shr 24) and $FF;
  168.    Inc(T);
  169.    Inc(S);
  170.   end;
  171. end;
  172. //---------------------------------------------------------------------------
  173. procedure Transform(Buffer: Pointer; var State: TMD5State);
  174. var
  175.  a, b, c, d: Longword;
  176.  Block: MD5Block;
  177. begin
  178.  Encode(Buffer, @Block, 64);
  179.  a:= State[0];
  180.  b:= State[1];
  181.  c:= State[2];
  182.  d:= State[3];
  183.  FF(a, b, c, d, Block[ 0],  7, $d76aa478);
  184.  FF(d, a, b, c, Block[ 1], 12, $e8c7b756);
  185.  FF(c, d, a, b, Block[ 2], 17, $242070db);
  186.  FF(b, c, d, a, Block[ 3], 22, $c1bdceee);
  187.  FF(a, b, c, d, Block[ 4],  7, $f57c0faf);
  188.  FF(d, a, b, c, Block[ 5], 12, $4787c62a);
  189.  FF(c, d, a, b, Block[ 6], 17, $a8304613);
  190.  FF(b, c, d, a, Block[ 7], 22, $fd469501);
  191.  FF(a, b, c, d, Block[ 8],  7, $698098d8);
  192.  FF(d, a, b, c, Block[ 9], 12, $8b44f7af);
  193.  FF(c, d, a, b, Block[10], 17, $ffff5bb1);
  194.  FF(b, c, d, a, Block[11], 22, $895cd7be);
  195.  FF(a, b, c, d, Block[12],  7, $6b901122);
  196.  FF(d, a, b, c, Block[13], 12, $fd987193);
  197.  FF(c, d, a, b, Block[14], 17, $a679438e);
  198.  FF(b, c, d, a, Block[15], 22, $49b40821);
  199.  GG(a, b, c, d, Block[ 1],  5, $f61e2562);
  200.  GG(d, a, b, c, Block[ 6],  9, $c040b340);
  201.  GG(c, d, a, b, Block[11], 14, $265e5a51);
  202.  GG(b, c, d, a, Block[ 0], 20, $e9b6c7aa);
  203.  GG(a, b, c, d, Block[ 5],  5, $d62f105d);
  204.  GG(d, a, b, c, Block[10],  9,  $2441453);
  205.  GG(c, d, a, b, Block[15], 14, $d8a1e681);
  206.  GG(b, c, d, a, Block[ 4], 20, $e7d3fbc8);
  207.  GG(a, b, c, d, Block[ 9],  5, $21e1cde6);
  208.  GG(d, a, b, c, Block[14],  9, $c33707d6);
  209.  GG(c, d, a, b, Block[ 3], 14, $f4d50d87);
  210.  GG(b, c, d, a, Block[ 8], 20, $455a14ed);
  211.  GG(a, b, c, d, Block[13],  5, $a9e3e905);
  212.  GG(d, a, b, c, Block[ 2],  9, $fcefa3f8);
  213.  GG(c, d, a, b, Block[ 7], 14, $676f02d9);
  214.  GG(b, c, d, a, Block[12], 20, $8d2a4c8a);
  215.  HH(a, b, c, d, Block[ 5],  4, $fffa3942);
  216.  HH(d, a, b, c, Block[ 8], 11, $8771f681);
  217.  HH(c, d, a, b, Block[11], 16, $6d9d6122);
  218.  HH(b, c, d, a, Block[14], 23, $fde5380c);
  219.  HH(a, b, c, d, Block[ 1],  4, $a4beea44);
  220.  HH(d, a, b, c, Block[ 4], 11, $4bdecfa9);
  221.  HH(c, d, a, b, Block[ 7], 16, $f6bb4b60);
  222.  HH(b, c, d, a, Block[10], 23, $bebfbc70);
  223.  HH(a, b, c, d, Block[13],  4, $289b7ec6);
  224.  HH(d, a, b, c, Block[ 0], 11, $eaa127fa);
  225.  HH(c, d, a, b, Block[ 3], 16, $d4ef3085);
  226.  HH(b, c, d, a, Block[ 6], 23,  $4881d05);
  227.  HH(a, b, c, d, Block[ 9],  4, $d9d4d039);
  228.  HH(d, a, b, c, Block[12], 11, $e6db99e5);
  229.  HH(c, d, a, b, Block[15], 16, $1fa27cf8);
  230.  HH(b, c, d, a, Block[ 2], 23, $c4ac5665);
  231.  II(a, b, c, d, Block[ 0],  6, $f4292244);
  232.  II(d, a, b, c, Block[ 7], 10, $432aff97);
  233.  II(c, d, a, b, Block[14], 15, $ab9423a7);
  234.  II(b, c, d, a, Block[ 5], 21, $fc93a039);
  235.  II(a, b, c, d, Block[12],  6, $655b59c3);
  236.  II(d, a, b, c, Block[ 3], 10, $8f0ccc92);
  237.  II(c, d, a, b, Block[10], 15, $ffeff47d);
  238.  II(b, c, d, a, Block[ 1], 21, $85845dd1);
  239.  II(a, b, c, d, Block[ 8],  6, $6fa87e4f);
  240.  II(d, a, b, c, Block[15], 10, $fe2ce6e0);
  241.  II(c, d, a, b, Block[ 6], 15, $a3014314);
  242.  II(b, c, d, a, Block[13], 21, $4e0811a1);
  243.  II(a, b, c, d, Block[ 4],  6, $f7537e82);
  244.  II(d, a, b, c, Block[11], 10, $bd3af235);
  245.  II(c, d, a, b, Block[ 2], 15, $2ad7d2bb);
  246.  II(b, c, d, a, Block[ 9], 21, $eb86d391);
  247.  Inc(State[0], a);
  248.  Inc(State[1], b);
  249.  Inc(State[2], c);
  250.  Inc(State[3], d);
  251. end;
  252. //---------------------------------------------------------------------------
  253. procedure MD5Init(out Context: TMD5Context);
  254. begin
  255.  with Context do
  256.   begin
  257.    State[0]:= $67452301;
  258.    State[1]:= $efcdab89;
  259.    State[2]:= $98badcfe;
  260.    State[3]:= $10325476;
  261.    Count[0]:= 0;
  262.    Count[1]:= 0;
  263.    FillChar(Buffer, SizeOf(TMD5Buffer), 0);
  264.   end;
  265. end;
  266. //---------------------------------------------------------------------------
  267. procedure MD5Update(var Context: TMD5Context; Source: Pointer; Size: Longword);
  268. var
  269.  Index: Longword;
  270.  PartLen: Longword;
  271.  i: Longword;
  272. begin
  273.  with Context do
  274.   begin
  275.    Index:= (Count[0] shr 3) and $3F;
  276.    Inc(Count[0], Size shl 3);
  277.    if (Count[0] < (Size shl 3)) then Inc(Count[1]);
  278.    Inc(Count[1], Size shr 29);
  279.   end;
  280.  PartLen:= 64 - Index;
  281.  if (Size >= PartLen) then
  282.   begin
  283.    Move(Source^, Context.Buffer[Index], PartLen);
  284.    Transform(@Context.Buffer, Context.State);
  285.    i:= PartLen;
  286.    while (i + 63 < Size) do
  287.     begin
  288.      Transform(@PByteArray(Source)[i], Context.State);
  289.      Inc(i, 64);
  290. end;
  291.    Index:= 0;
  292. end else i:= 0;
  293.  Move(PByteArray(Source)[i], Context.Buffer[Index], Size - i);
  294. end;
  295. //---------------------------------------------------------------------------
  296. procedure MD5Final(var Context: TMD5Context; out Digest: TMD5Digest);
  297. var
  298.  Bits  : MD5CBits;
  299.  Index : Longword;
  300.  PadLen: Longword;
  301. begin
  302.  Decode(@Context.Count, @Bits, 2);
  303.  Index:= (Context.Count[0] shr 3) and $3F;
  304.  if (Index < 56) then PadLen:= 56 - Index else PadLen:= 120 - Index;
  305.  MD5Update(Context, @Padding, PadLen);
  306.  MD5Update(Context, @Bits, 8);
  307.  Decode(@Context.State, @Digest, 4);
  308.  FillChar(Context, SizeOf(TMD5Context), 0);
  309. end;
  310. //---------------------------------------------------------------------------
  311. procedure MD5Checksum(Source: Pointer; Size: Integer; Checksum: Pointer);
  312. var
  313.  Context: TMD5Context;
  314.  DigestM: TMD5Digest;
  315. begin
  316.  MD5Init(Context);
  317.  MD5Update(Context, Source, Size);
  318.  MD5Final(Context, DigestM);
  319.  Move(DigestM, Checksum^, SizeOf(TMD5Digest));
  320. end;
  321. //---------------------------------------------------------------------------
  322. end.