<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=8551&amp;view=findpost&amp;p=526499</guid>
        <pubDate>Mon, 29 Nov 2004 07:14:01 +0000</pubDate>
        <title>Алгоритм шифрования MD5</title>
        <link>https://forum.sources.ru/index.php?showtopic=8551&amp;view=findpost&amp;p=526499</link>
        <description><![CDATA[Song: Другой вариант:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit md5;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses Windows, SysUtils, Classes;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">{ The TMD5Digest record is the type of results of</div><div class="code_line">&nbsp;the MD5 hashsum evaluation functions. The contents</div><div class="code_line">&nbsp;of a record may be used as four 32-bit integer values</div><div class="code_line">&nbsp;or as an array of 16 bytes }</div><div class="code_line">PMD5Digest = ^TMD5Digest;</div><div class="code_line">TMD5Digest = record</div><div class="code_line">&nbsp;case Integer of</div><div class="code_line">&nbsp;&nbsp;0: (A, B, C, D: LongInt);</div><div class="code_line">&nbsp;&nbsp;1: (v: array [0..15] of Byte);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5String function evaluates the MD5 hashsum for</div><div class="code_line">&nbsp;a string. The S parameter specifies a string to</div><div class="code_line">&nbsp;evaluate hashsum }</div><div class="code_line">function MD5String(const S: string): TMD5Digest;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5File function evaluates the MD5 hashsum for</div><div class="code_line">&nbsp;a file. The FileName parameter specifies the name</div><div class="code_line">&nbsp;of a file to evaluate hashsum }</div><div class="code_line">function MD5File(const FileName: string): TMD5Digest;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5Stream function evaluates the MD5 hashsum for</div><div class="code_line">&nbsp;a stream. The Stream parameters specifies the</div><div class="code_line">&nbsp;TStream descendant class object to evaluate hashsum }</div><div class="code_line">function MD5Stream(const Stream: TStream): TMD5Digest;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5Buffer function evaluates the MD5 hashsum for</div><div class="code_line">&nbsp;any memory buffer. The Buffer parameters specifies a</div><div class="code_line">&nbsp;buffer to evaluate hashsum. The Size parameter specifies</div><div class="code_line">&nbsp;the size (in bytes) of a buffer }</div><div class="code_line">function MD5Buffer(const Buffer; Size: Integer): TMD5Digest;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5DigestToStr function converts the result of</div><div class="code_line">&nbsp;a hashsum evaluation function into a string of</div><div class="code_line">&nbsp;hexadecimal digits }</div><div class="code_line">function MD5DigestToStr(const Digest: TMD5Digest): string;</div><div class="code_line">&nbsp;</div><div class="code_line">{ The MD5DigestCompare function compares two</div><div class="code_line">&nbsp;TMD5Digest record variables. This function returns</div><div class="code_line">&nbsp;TRUE if parameters are equal or FALSE otherwise }</div><div class="code_line">function MD5DigestCompare(const Digest1, Digest2: TMD5Digest): Boolean;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All</div><div class="code_line">rights reserved.</div><div class="code_line">&nbsp;</div><div class="code_line">License to copy and use this software is granted provided that it</div><div class="code_line">is identified as the &quot;RSA Data Security, Inc. MD5 Message-Digest</div><div class="code_line">Algorithm&quot; in all material mentioning or referencing this software</div><div class="code_line">or this function.</div><div class="code_line">&nbsp;</div><div class="code_line">License is also granted to make and use derivative works provided</div><div class="code_line">that such works are identified as &quot;derived from the RSA Data</div><div class="code_line">Security, Inc. MD5 Message-Digest Algorithm&quot; in all material</div><div class="code_line">mentioning or referencing the derived work.</div><div class="code_line">&nbsp;</div><div class="code_line">RSA Data Security, Inc. makes no representations concerning either</div><div class="code_line">the merchantability of this software or the suitability of this</div><div class="code_line">software for any particular purpose. It is provided &quot;as is&quot;</div><div class="code_line">without express or implied warranty of any kind.</div><div class="code_line">&nbsp;</div><div class="code_line">These notices must be retained in any copies of any part of this</div><div class="code_line">documentation and/or software.</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">UINT4 = LongWord;</div><div class="code_line">&nbsp;</div><div class="code_line">PArray4UINT4 = ^TArray4UINT4;</div><div class="code_line">TArray4UINT4 = array [0..3] of UINT4;</div><div class="code_line">PArray2UINT4 = ^TArray2UINT4;</div><div class="code_line">TArray2UINT4 = array [0..1] of UINT4;</div><div class="code_line">PArray16Byte = ^TArray16Byte;</div><div class="code_line">TArray16Byte = array [0..15] of Byte;</div><div class="code_line">PArray64Byte = ^TArray64Byte;</div><div class="code_line">TArray64Byte = array [0..63] of Byte;</div><div class="code_line">&nbsp;</div><div class="code_line">PByteArray = ^TByteArray;</div><div class="code_line">TByteArray = array [0..0] of Byte;</div><div class="code_line">&nbsp;</div><div class="code_line">PUINT4Array = ^TUINT4Array;</div><div class="code_line">TUINT4Array = array [0..0] of UINT4;</div><div class="code_line">&nbsp;</div><div class="code_line">PMD5Context = ^TMD5Context;</div><div class="code_line">TMD5Context = record</div><div class="code_line">&nbsp;&nbsp;state: TArray4UINT4;</div><div class="code_line">&nbsp;&nbsp;count: TArray2UINT4;</div><div class="code_line">&nbsp;&nbsp;buffer: TArray64Byte;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;S11 = 7;</div><div class="code_line">&nbsp;S12 = 12;</div><div class="code_line">&nbsp;S13 = 17;</div><div class="code_line">&nbsp;S14 = 22;</div><div class="code_line">&nbsp;S21 = 5;</div><div class="code_line">&nbsp;S22 = 9;</div><div class="code_line">&nbsp;S23 = 14;</div><div class="code_line">&nbsp;S24 = 20;</div><div class="code_line">&nbsp;S31 = 4;</div><div class="code_line">&nbsp;S32 = 11;</div><div class="code_line">&nbsp;S33 = 16;</div><div class="code_line">&nbsp;S34 = 23;</div><div class="code_line">&nbsp;S41 = 6;</div><div class="code_line">&nbsp;S42 = 10;</div><div class="code_line">&nbsp;S43 = 15;</div><div class="code_line">&nbsp;S44 = 21;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">Padding : TArray64Byte =</div><div class="code_line">(, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,</div><div class="code_line">&nbsp;0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,</div><div class="code_line">&nbsp;0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">function _F(x, y, z: UINT4): UINT4;</div><div class="code_line">begin</div><div class="code_line">Result := (((x) and (y)) or ((not x) and (z)));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function _G(x, y, z: UINT4): UINT4;</div><div class="code_line">begin</div><div class="code_line">Result := (((x) and (z)) or ((y) and (not z)));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function _H(x, y, z: UINT4): UINT4;</div><div class="code_line">begin</div><div class="code_line">Result := ((x) xor (y) xor (z));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function _I(x, y, z: UINT4): UINT4;</div><div class="code_line">begin</div><div class="code_line">Result := ((y) xor ((x) or ( not z)));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function ROTATE_LEFT(x, n: UINT4): UINT4;</div><div class="code_line">begin</div><div class="code_line">Result := (((x) shl (n)) or ((x) shr (32-(n))));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure FF(var a: UINT4; b, c, d, x, s, ac: UINT4);</div><div class="code_line">begin</div><div class="code_line">&nbsp;a := a + _F(b, c, d) + x + ac;</div><div class="code_line">&nbsp;a := ROTATE_LEFT (a, s);</div><div class="code_line">&nbsp;a := a + b;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure GG(var a: UINT4; b, c, d, x, s, ac: UINT4);</div><div class="code_line">begin</div><div class="code_line">a := a + _G(b, c, d) + x + ac;</div><div class="code_line">a := ROTATE_LEFT(a, s);</div><div class="code_line">a := a + b;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure HH(var a: UINT4; b, c, d, x, s, ac: UINT4);</div><div class="code_line">begin</div><div class="code_line">a := a + _H(b, c, d) + x + ac;</div><div class="code_line">a := ROTATE_LEFT(a, s);</div><div class="code_line">a := a + b;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure II(var a: UINT4; b, c, d, x, s, ac: UINT4);</div><div class="code_line">begin</div><div class="code_line">a := a + _I(b, c, d) + x + ac;</div><div class="code_line">a := ROTATE_LEFT(a, s);</div><div class="code_line">a := a + b;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Encode(Output: PByteArray; Input: PUINT4Array; Len: LongWord);</div><div class="code_line">var</div><div class="code_line">i, j: LongWord;</div><div class="code_line">begin</div><div class="code_line">j:=0;</div><div class="code_line">i:=0;</div><div class="code_line">while j &#60; Len do &nbsp;begin</div><div class="code_line">&nbsp;output[j] := Byte(input[i] and $ff);</div><div class="code_line">&nbsp;output[j+1] := Byte((input[i] shr 8) and $ff);</div><div class="code_line">&nbsp;output[j+2] := Byte((input[i] shr 16) and $ff);</div><div class="code_line">&nbsp;output[j+3] := Byte((input[i] shr 24) and $ff);</div><div class="code_line">&nbsp;Inc(j, 4);</div><div class="code_line">&nbsp;Inc(i);</div><div class="code_line">end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Decode(Output: PUINT4Array; Input: PByteArray; Len: LongWord);</div><div class="code_line">var</div><div class="code_line">i, j: LongWord;</div><div class="code_line">begin</div><div class="code_line">j:=0;</div><div class="code_line">i:=0;</div><div class="code_line">while j &#60; Len do begin</div><div class="code_line">&nbsp;Output[i] := UINT4(input[j]) or (UINT4(input[j+1]) shl 8) or</div><div class="code_line">&nbsp;&nbsp;(UINT4(input[j+2]) shl 16) or ( UINT4(input[j+3]) shl 24);</div><div class="code_line">&nbsp;Inc(j, 4);</div><div class="code_line">&nbsp;Inc(i);</div><div class="code_line">end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5_memcpy(Output: PByteArray; Input: PByteArray; Len: LongWord);</div><div class="code_line">begin</div><div class="code_line">Move(Input^, Output^, Len);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5_memset(Output: PByteArray; Value: Integer; Len: LongWord);</div><div class="code_line">begin</div><div class="code_line">FillChar(Output^, Len, Byte(Value));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Transform(State: PArray4UINT4; Buffer: PArray64Byte);</div><div class="code_line">var</div><div class="code_line">a, b, c, d: UINT4;</div><div class="code_line">x : array[0..15] of UINT4;</div><div class="code_line">begin</div><div class="code_line">a:=State[0]; b:=State[1]; c:=State[2]; d:=State[3];</div><div class="code_line">MD5Decode(PUINT4Array(@x), PByteArray(Buffer), 64);</div><div class="code_line">&nbsp;</div><div class="code_line">FF (a, b, c, d, x[ 0], S11, $d76aa478);</div><div class="code_line">FF (d, a, b, c, x[ 1], S12, $e8c7b756);</div><div class="code_line">FF (c, d, a, b, x[ 2], S13, 2070db);</div><div class="code_line">FF (b, c, d, a, x[ 3], S14, $c1bdceee);</div><div class="code_line">FF (a, b, c, d, x[ 4], S11, $f57c0faf);</div><div class="code_line">FF (d, a, b, c, x[ 5], S12, 87c62a);</div><div class="code_line">FF (c, d, a, b, x[ 6], S13, $a8304613);</div><div class="code_line">FF (b, c, d, a, x[ 7], S14, $fd469501);</div><div class="code_line">FF (a, b, c, d, x[ 8], S11, 8098d8);</div><div class="code_line">FF (d, a, b, c, x[ 9], S12, b44f7af);</div><div class="code_line">FF (c, d, a, b, x[10], S13, $ffff5bb1);</div><div class="code_line">FF (b, c, d, a, x[11], S14, 5cd7be);</div><div class="code_line">FF (a, b, c, d, x[12], S11, b901122);</div><div class="code_line">FF (d, a, b, c, x[13], S12, $fd987193);</div><div class="code_line">FF (c, d, a, b, x[14], S13, $a679438e);</div><div class="code_line">FF (b, c, d, a, x[15], S14, b40821);</div><div class="code_line">&nbsp;</div><div class="code_line">GG (a, b, c, d, x[ 1], S21, $f61e2562);</div><div class="code_line">GG (d, a, b, c, x[ 6], S22, $c040b340);</div><div class="code_line">GG (c, d, a, b, x[11], S23, 5e5a51);</div><div class="code_line">GG (b, c, d, a, x[ 0], S24, $e9b6c7aa);</div><div class="code_line">GG (a, b, c, d, x[ 5], S21, $d62f105d);</div><div class="code_line">GG (d, a, b, c, x[10], S22, &nbsp;41453);</div><div class="code_line">GG (c, d, a, b, x[15], S23, $d8a1e681);</div><div class="code_line">GG (b, c, d, a, x[ 4], S24, $e7d3fbc8);</div><div class="code_line">GG (a, b, c, d, x[ 9], S21, e1cde6);</div><div class="code_line">GG (d, a, b, c, x[14], S22, $c33707d6);</div><div class="code_line">GG (c, d, a, b, x[ 3], S23, $f4d50d87);</div><div class="code_line">&nbsp;</div><div class="code_line">GG (b, c, d, a, x[ 8], S24, 5a14ed);</div><div class="code_line">GG (a, b, c, d, x[13], S21, $a9e3e905);</div><div class="code_line">GG (d, a, b, c, x[ 2], S22, $fcefa3f8);</div><div class="code_line">GG (c, d, a, b, x[ 7], S23, 6f02d9);</div><div class="code_line">GG (b, c, d, a, x[12], S24, d2a4c8a);</div><div class="code_line">&nbsp;</div><div class="code_line">HH (a, b, c, d, x[ 5], S31, $fffa3942);</div><div class="code_line">HH (d, a, b, c, x[ 8], S32, 71f681);</div><div class="code_line">HH (c, d, a, b, x[11], S33, d9d6122);</div><div class="code_line">HH (b, c, d, a, x[14], S34, $fde5380c);</div><div class="code_line">HH (a, b, c, d, x[ 1], S31, $a4beea44);</div><div class="code_line">HH (d, a, b, c, x[ 4], S32, bdecfa9);</div><div class="code_line">HH (c, d, a, b, x[ 7], S33, $f6bb4b60);</div><div class="code_line">HH (b, c, d, a, x[10], S34, $bebfbc70);</div><div class="code_line">HH (a, b, c, d, x[13], S31, 9b7ec6);</div><div class="code_line">HH (d, a, b, c, x[ 0], S32, $eaa127fa);</div><div class="code_line">HH (c, d, a, b, x[ 3], S33, $d4ef3085);</div><div class="code_line">HH (b, c, d, a, x[ 6], S34, &nbsp;81d05);</div><div class="code_line">HH (a, b, c, d, x[ 9], S31, $d9d4d039);</div><div class="code_line">HH (d, a, b, c, x[12], S32, $e6db99e5);</div><div class="code_line">HH (c, d, a, b, x[15], S33, fa27cf8);</div><div class="code_line">HH (b, c, d, a, x[ 2], S34, $c4ac5665);</div><div class="code_line">&nbsp;</div><div class="code_line">II (a, b, c, d, x[ 0], S41, $f4292244);</div><div class="code_line">II (d, a, b, c, x[ 7], S42, 2aff97);</div><div class="code_line">II (c, d, a, b, x[14], S43, $ab9423a7);</div><div class="code_line">II (b, c, d, a, x[ 5], S44, $fc93a039);</div><div class="code_line">II (a, b, c, d, x[12], S41, 5b59c3);</div><div class="code_line">II (d, a, b, c, x[ 3], S42, f0ccc92);</div><div class="code_line">II (c, d, a, b, x[10], S43, $ffeff47d);</div><div class="code_line">II (b, c, d, a, x[ 1], S44, 845dd1);</div><div class="code_line">II (a, b, c, d, x[ 8], S41, fa87e4f);</div><div class="code_line">II (d, a, b, c, x[15], S42, $fe2ce6e0);</div><div class="code_line">II (c, d, a, b, x[ 6], S43, $a3014314);</div><div class="code_line">II (b, c, d, a, x[13], S44, e0811a1);</div><div class="code_line">II (a, b, c, d, x[ 4], S41, $f7537e82);</div><div class="code_line">II (d, a, b, c, x[11], S42, $bd3af235);</div><div class="code_line">II (c, d, a, b, x[ 2], S43, ad7d2bb);</div><div class="code_line">II (b, c, d, a, x[ 9], S44, $eb86d391);</div><div class="code_line">&nbsp;</div><div class="code_line">Inc(State[0], a);</div><div class="code_line">Inc(State[1], b);</div><div class="code_line">Inc(State[2], c);</div><div class="code_line">Inc(State[3], d);</div><div class="code_line">&nbsp;</div><div class="code_line">MD5_memset (PByteArray(@x), 0, SizeOf (x));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Init(var Context: TMD5Context);</div><div class="code_line">begin</div><div class="code_line">FillChar(Context, SizeOf(Context), 0);</div><div class="code_line">Context.state[0] := 452301;</div><div class="code_line">Context.state[1] := $efcdab89;</div><div class="code_line">Context.state[2] := badcfe;</div><div class="code_line">Context.state[3] := 325476;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Update(var Context: TMD5Context; Input: PByteArray; InputLen: LongWord);</div><div class="code_line">var</div><div class="code_line">i, index, partLen: LongWord;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">index := LongWord( (context.count[0] shr 3) and F);</div><div class="code_line">Inc(Context.count[0], UINT4(InputLen) shl 3);</div><div class="code_line">if Context.count[0] &#60; UINT4(InputLen) shl 3 then Inc(Context.count[1]);</div><div class="code_line">Inc(Context.count[1], UINT4(InputLen) shr 29);</div><div class="code_line">partLen := 64 - index;</div><div class="code_line">if inputLen &#62;= partLen then begin</div><div class="code_line">&nbsp;MD5_memcpy(PByteArray(@Context.buffer[index]), Input, PartLen);</div><div class="code_line">&nbsp;MD5Transform(@Context.state, @Context.buffer);</div><div class="code_line">&nbsp;i := partLen;</div><div class="code_line">&nbsp;while i + 63 &#60; inputLen do begin</div><div class="code_line">&nbsp;&nbsp;MD5Transform(@Context.state, PArray64Byte(@Input[i]));</div><div class="code_line">&nbsp;&nbsp;Inc(i, 64);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;index := 0;</div><div class="code_line">end else i:=0;</div><div class="code_line">MD5_memcpy(PByteArray(@Context.buffer[index]), PByteArray(@Input[i]), inputLen - i);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure MD5Final(var Digest: TMD5Digest; var Context: TMD5Context);</div><div class="code_line">var</div><div class="code_line">bits: array [0..7] of Byte;</div><div class="code_line">index, padLen: LongWord;</div><div class="code_line">begin</div><div class="code_line">MD5Encode(PByteArray(@bits), PUINT4Array(@Context.count), 8);</div><div class="code_line">index := LongWord( (Context.count[0] shr 3) and F);</div><div class="code_line">if index &#60; 56 then padLen := 56 - index else padLen := 120 - index;</div><div class="code_line">MD5Update(Context, PByteArray(@PADDING), padLen);</div><div class="code_line">MD5Update(Context, PByteArray(@Bits), 8);</div><div class="code_line">MD5Encode(PByteArray(@Digest), PUINT4Array(@Context.state), 16);</div><div class="code_line">MD5_memset(PByteArray(@Context), 0, SizeOf(Context));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5DigestToStr(const Digest: TMD5Digest): string;</div><div class="code_line">var</div><div class="code_line">i: Integer;</div><div class="code_line">begin</div><div class="code_line">Result:=&#39;&#39;;</div><div class="code_line">for i:=0 to 15 do Result:=Result+IntToHex(Digest.v[i], 2);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5String(const S: string): TMD5Digest;</div><div class="code_line">begin</div><div class="code_line">Result:=MD5Buffer(PChar(S)^, Length(S));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5File(const FileName: string): TMD5Digest;</div><div class="code_line">var</div><div class="code_line">F: TFileStream;</div><div class="code_line">begin</div><div class="code_line">F:=TFileStream.Create(FileName, fmOpenRead);</div><div class="code_line">try</div><div class="code_line">&nbsp;Result:=MD5Stream(F);</div><div class="code_line">finally</div><div class="code_line">&nbsp;F.Free;</div><div class="code_line">end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5Stream(const Stream: TStream): TMD5Digest;</div><div class="code_line">var</div><div class="code_line">Context: TMD5Context;</div><div class="code_line">Buffer: array[0..4095] of Byte;</div><div class="code_line">Size: Integer;</div><div class="code_line">ReadBytes : Integer;</div><div class="code_line">TotalBytes : Integer;</div><div class="code_line">SavePos: Integer;</div><div class="code_line">begin</div><div class="code_line">MD5Init(Context);</div><div class="code_line">Size:=Stream.Size;</div><div class="code_line">SavePos:=Stream.Position;</div><div class="code_line">TotalBytes:=0;</div><div class="code_line">try</div><div class="code_line">&nbsp;Stream.Seek(0, soFromBeginning);</div><div class="code_line">&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp;ReadBytes:=Stream.Read(Buffer, SizeOf(Buffer));</div><div class="code_line">&nbsp;&nbsp;Inc(TotalBytes, ReadBytes);</div><div class="code_line">&nbsp;&nbsp;MD5Update(Context, @Buffer, ReadBytes);</div><div class="code_line">&nbsp;until (ReadBytes = 0) or (TotalBytes = Size);</div><div class="code_line">finally</div><div class="code_line">&nbsp;Stream.Seek(SavePos, soFromBeginning);</div><div class="code_line">end;</div><div class="code_line">MD5Final(Result, Context);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5Buffer(const Buffer; Size: Integer): TMD5Digest;</div><div class="code_line">var</div><div class="code_line">Context: TMD5Context;</div><div class="code_line">begin</div><div class="code_line">MD5Init(Context);</div><div class="code_line">MD5Update(Context, PByteArray(@Buffer), Size);</div><div class="code_line">MD5Final(Result, Context);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5DigestCompare(const Digest1, Digest2: TMD5Digest): Boolean;</div><div class="code_line">begin</div><div class="code_line">Result:=False;</div><div class="code_line">if Digest1.A &#60;&#62; Digest2.A then Exit;</div><div class="code_line">if Digest1.B &#60;&#62; Digest2.B then Exit;</div><div class="code_line">if Digest1.C &#60;&#62; Digest2.C then Exit;</div><div class="code_line">if Digest1.D &#60;&#62; Digest2.D then Exit;</div><div class="code_line">Result:=True;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Song</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=8551&amp;view=findpost&amp;p=86299</guid>
        <pubDate>Thu, 06 Nov 2003 06:24:27 +0000</pubDate>
        <title>Алгоритм шифрования MD5</title>
        <link>https://forum.sources.ru/index.php?showtopic=8551&amp;view=findpost&amp;p=86299</link>
        <description><![CDATA[Song: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Function md5(s:string):string; </div><div class="code_line">&nbsp; var a:array[0..15] of byte; </div><div class="code_line">&nbsp;     i:integer; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  LenHi, LenLo: longword; </div><div class="code_line">&nbsp;  Index: DWord; </div><div class="code_line">&nbsp;  HashBuffer: array[0..63] of byte; </div><div class="code_line">&nbsp;  CurrentHash: array[0..3] of DWord; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;  procedure Burn; </div><div class="code_line">&nbsp;  begin </div><div class="code_line">&nbsp;    LenHi:= 0; LenLo:= 0; </div><div class="code_line">&nbsp;    Index:= 0; </div><div class="code_line">&nbsp;    FillChar(HashBuffer,Sizeof(HashBuffer),0); </div><div class="code_line">&nbsp;    FillChar(CurrentHash,Sizeof(CurrentHash),0); </div><div class="code_line">&nbsp;  end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp; procedure Init; </div><div class="code_line">&nbsp; begin </div><div class="code_line">&nbsp;   Burn; </div><div class="code_line">&nbsp;   CurrentHash[0]:= 452301; </div><div class="code_line">&nbsp;   CurrentHash[1]:= $efcdab89; </div><div class="code_line">&nbsp;   CurrentHash[2]:= badcfe; </div><div class="code_line">&nbsp;   CurrentHash[3]:= 325476; </div><div class="code_line">&nbsp; end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp; function LRot32(a, b: longword): longword; </div><div class="code_line">&nbsp; begin </div><div class="code_line">&nbsp;   Result:= (a shl b) or (a shr (32-b)); </div><div class="code_line">&nbsp; end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp; procedure Compress; </div><div class="code_line">&nbsp; var </div><div class="code_line">&nbsp;   Data: array[0..15] of dword; </div><div class="code_line">&nbsp;   A, B, C, D: dword; </div><div class="code_line">&nbsp; begin </div><div class="code_line">&nbsp;   Move(HashBuffer,Data,Sizeof(Data)); </div><div class="code_line">&nbsp;   A:= CurrentHash[0]; </div><div class="code_line">&nbsp;   B:= CurrentHash[1]; </div><div class="code_line">&nbsp;   C:= CurrentHash[2]; </div><div class="code_line">&nbsp;   D:= CurrentHash[3]; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 0] + $d76aa478,7); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 1] + $e8c7b756,12); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 2] + 2070db,17); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 3] + $c1bdceee,22); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 4] + $f57c0faf,7); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 5] + 87c62a,12); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 6] + $a8304613,17); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 7] + $fd469501,22); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 8] + 8098d8,7); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 9] + b44f7af,12); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[10] + $ffff5bb1,17); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[11] + 5cd7be,22); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[12] + b901122,7); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[13] + $fd987193,12); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[14] + $a679438e,17); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[15] + b40821,22); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 1] + $f61e2562,5); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 6] + $c040b340,9); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[11] + 5e5a51,14); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 0] + $e9b6c7aa,20); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 5] + $d62f105d,5); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[10] + 441453,9); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[15] + $d8a1e681,14); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 4] + $e7d3fbc8,20); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 9] + e1cde6,5); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[14] + $c33707d6,9); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 3] + $f4d50d87,14); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 8] + 5a14ed,20); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[13] + $a9e3e905,5); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 2] + $fcefa3f8,9); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 7] + 6f02d9,14); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[12] + d2a4c8a,20); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   A:= B + LRot32(A + (B xor C xor D) + Data[ 5] + $fffa3942,4); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (A xor B xor C) + Data[ 8] + 71f681,11); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (D xor A xor B) + Data[11] + d9d6122,16); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (C xor D xor A) + Data[14] + $fde5380c,23); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (B xor C xor D) + Data[ 1] + $a4beea44,4); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (A xor B xor C) + Data[ 4] + bdecfa9,11); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (D xor A xor B) + Data[ 7] + $f6bb4b60,16); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (C xor D xor A) + Data[10] + $bebfbc70,23); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (B xor C xor D) + Data[13] + 9b7ec6,4); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (A xor B xor C) + Data[ 0] + $eaa127fa,11); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (D xor A xor B) + Data[ 3] + $d4ef3085,16); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (C xor D xor A) + Data[ 6] + 881d05,23); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (B xor C xor D) + Data[ 9] + $d9d4d039,4); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (A xor B xor C) + Data[12] + $e6db99e5,11); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (D xor A xor B) + Data[15] + fa27cf8,16); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (C xor D xor A) + Data[ 2] + $c4ac5665,23); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 0] + $f4292244,6); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 7] + 2aff97,10); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (D or (not B))) + Data[14] + $ab9423a7,15); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 5] + $fc93a039,21); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (B or (not D))) + Data[12] + 5b59c3,6); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 3] + f0ccc92,10); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (D or (not B))) + Data[10] + $ffeff47d,15); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 1] + 845dd1,21); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 8] + fa87e4f,6); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (A or (not C))) + Data[15] + $fe2ce6e0,10); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 6] + $a3014314,15); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (C or (not A))) + Data[13] + e0811a1,21); </div><div class="code_line">&nbsp;   A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 4] + $f7537e82,6); </div><div class="code_line">&nbsp;   D:= A + LRot32(D + (B xor (A or (not C))) + Data[11] + $bd3af235,10); </div><div class="code_line">&nbsp;   C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 2] + ad7d2bb,15); </div><div class="code_line">&nbsp;   B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 9] + $eb86d391,21); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   Inc(CurrentHash[0],A); </div><div class="code_line">&nbsp;   Inc(CurrentHash[1],B); </div><div class="code_line">&nbsp;   Inc(CurrentHash[2],C); </div><div class="code_line">&nbsp;   Inc(CurrentHash[3],D); </div><div class="code_line">&nbsp;   Index:= 0; </div><div class="code_line">&nbsp;   FillChar(HashBuffer,Sizeof(HashBuffer),0); </div><div class="code_line">&nbsp; end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp; procedure Update(const Buffer; Size: longword); </div><div class="code_line">&nbsp; var </div><div class="code_line">&nbsp;   PBuf: ^byte; </div><div class="code_line">&nbsp; begin </div><div class="code_line">&nbsp;   Inc(LenHi,Size shr 29); </div><div class="code_line">&nbsp;   Inc(LenLo,Size*8); </div><div class="code_line">&nbsp;   if LenLo&#60; (Size*8) then </div><div class="code_line">&nbsp;     Inc(LenHi); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;   PBuf:= @Buffer; </div><div class="code_line">&nbsp;   while Size&#62; 0 do </div><div class="code_line">&nbsp;   begin </div><div class="code_line">&nbsp;     if (Sizeof(HashBuffer)-Index)&#60;= DWord(Size) then </div><div class="code_line">&nbsp;     begin </div><div class="code_line">&nbsp;       Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); </div><div class="code_line">&nbsp;       Dec(Size,Sizeof(HashBuffer)-Index); </div><div class="code_line">&nbsp;       Inc(PBuf,Sizeof(HashBuffer)-Index); </div><div class="code_line">&nbsp;       Compress; </div><div class="code_line">&nbsp;     end </div><div class="code_line">&nbsp;     else </div><div class="code_line">&nbsp;     begin </div><div class="code_line">&nbsp;       Move(PBuf^,HashBuffer[Index],Size); </div><div class="code_line">&nbsp;       Inc(Index,Size); </div><div class="code_line">&nbsp;       Size:= 0; </div><div class="code_line">&nbsp;     end; </div><div class="code_line">&nbsp;   end; </div><div class="code_line">&nbsp; end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp; procedure Final(var Digest); </div><div class="code_line">&nbsp; begin </div><div class="code_line">&nbsp;   HashBuffer[Index]:= ; </div><div class="code_line">&nbsp;   if Index&#62;= 56 then Compress; </div><div class="code_line">&nbsp;   PDWord(@HashBuffer[56])^:= LenLo; </div><div class="code_line">&nbsp;   PDWord(@HashBuffer[60])^:= LenHi; </div><div class="code_line">&nbsp;   Compress; </div><div class="code_line">&nbsp;   Move(CurrentHash,Digest,Sizeof(CurrentHash)); </div><div class="code_line">&nbsp;   Burn; </div><div class="code_line">&nbsp; end; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">begin </div><div class="code_line">&nbsp; Init; </div><div class="code_line">&nbsp; Update(s[1],Length(s)); </div><div class="code_line">&nbsp; Final(a); </div><div class="code_line">&nbsp; result:=&#39;&#39;; </div><div class="code_line">&nbsp; for i:=0 to 15 do </div><div class="code_line">&nbsp;   result:=result+IntToHex(a[i],2); </div><div class="code_line">&nbsp; Burn; </div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Song</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	