<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.162.229.137</id>
	<title>wiki12 - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.162.229.137"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.162.229.137"/>
	<updated>2026-07-17T19:19:35Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=MD4&amp;diff=10787</id>
		<title>MD4</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=MD4&amp;diff=10787"/>
		<updated>2022-04-05T02:53:34Z</updated>

		<summary type="html">&lt;p&gt;188.162.229.137: Удалена ошибочная строчка, вводящая, в заблуждение пользователей.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка хеш-функции&lt;br /&gt;
|название      = MD4&lt;br /&gt;
|изображение   = &lt;br /&gt;
|создатель     = [[Ривест, Рональд|Рональд Ривест]]&lt;br /&gt;
|создан        = [[1990]] г.&lt;br /&gt;
|опубликован   = октябрь [[1990]] г.&lt;br /&gt;
|размер хеша   = 128 бит&lt;br /&gt;
|число раундов = 3&lt;br /&gt;
|тип           = [[хеш-функция]]&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;MD4&#039;&#039;&#039; (&#039;&#039;Message Digest 4&#039;&#039;) — [[криптографическая хеш-функция]], разработанная профессором [[Массачусетский технологический институт|Массачусетского университета]] [[Ривест, Рональд|Рональдом Ривестом]] в 1990 году, и впервые описанная в RFC 1186.&lt;br /&gt;
Для произвольного входного сообщения [[Функция (программирование)|функция]] генерирует 128-разрядное хеш-значение, называемое [[Хеш-сумма|дайджестом]] сообщения. Этот алгоритм используется в протоколе [[аутентификация|аутентификации]] [[MS-CHAP]], разработанном корпорацией [[Майкрософт]] для выполнения процедур проверки подлинности удаленных рабочих станций [[Windows]]. Является предшественником [[MD5]].&lt;br /&gt;
&lt;br /&gt;
[[Файл:MD4.svg|right|thumbnail|300px|Одна операция MD4. Хеширование с MD4 состоит из 48 таких операций, сгруппированных в 3 раунда по 16 операций. &#039;&#039;F&#039;&#039; — нелинейная функция; в каждом раунде функция меняется. &#039;&#039;M&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; означает 32-битный блок входного сообщения, а &#039;&#039;K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; — 32-битная константа, различная для каждой операции.]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритм MD4 ==&lt;br /&gt;
Предполагается, что на вход подано сообщение, состоящее из &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, хеш которого нам предстоит вычислить. Здесь &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — произвольное неотрицательное [[целое число]]; оно может быть нулём, не обязано быть кратным восьми, и может быть сколь угодно большим. Запишем сообщение побитно, в виде:&lt;br /&gt;
   &amp;lt;math&amp;gt;m_0 m_1 \ldots m_{b-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ниже приведены 5 шагов, используемые для вычисления хеша сообщения.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 1. Добавление недостающих битов. ===&lt;br /&gt;
Сообщение расширяется так, чтобы его длина в битах по модулю 512 равнялась 448. Таким образом, в результате расширения, сообщению недостает 64 бита до длины, кратной 512 битам. Расширение производится всегда, даже если сообщение изначально имеет нужную длину.&lt;br /&gt;
&lt;br /&gt;
Расширение производится следующим образом: один бит, равный 1, добавляется к сообщению, а затем добавляются биты, равные 0, до тех пор, пока длина сообщения не станет равной 448 по модулю 512. В итоге, к сообщению добавляется как минимум 1 бит, и как максимум 512.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 2. Добавление длины сообщения. ===&lt;br /&gt;
64-битное представление &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; (длины сообщения перед добавлением набивочных битов) добавляется к результату предыдущего шага. В маловероятном случае, когда &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; больше, чем &amp;lt;math&amp;gt;2^{64}&amp;lt;/math&amp;gt;, используются только 64 младших бита. Эти биты добавляются в виде двух 32-битных слов, и первым добавляется слово, содержащее младшие разряды.&lt;br /&gt;
&lt;br /&gt;
На этом этапе (после добавления битов и длины сообщения) мы получаем сообщение длиной, кратной 512 битам. Это эквивалентно тому, что это сообщение имеет длину, кратную 16-ти 32-битным словам. Пусть &amp;lt;math&amp;gt;M[0 \ldots N-1]&amp;lt;/math&amp;gt; означает массив слов получившегося сообщения (здесь &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; кратно 16).&lt;br /&gt;
&lt;br /&gt;
=== Шаг 3. Инициализация MD-буфера. ===&lt;br /&gt;
Для вычисления хеша сообщения используется буфер, состоящий из 4 слов (32-битных регистров): &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt;. Эти регистры инициализируются следующими шестнадцатеричными числами (младшие байты сначала):&lt;br /&gt;
        word &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: 01 23 45 67&lt;br /&gt;
        word &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;: 89 ab cd ef&lt;br /&gt;
        word &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;: fe dc ba 98&lt;br /&gt;
        word &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;: 76 54 32 10&lt;br /&gt;
&lt;br /&gt;
=== Шаг 4. Обработка сообщения блоками по 16 слов. ===&lt;br /&gt;
Для начала определим три вспомогательные функции, каждая из которых получает на вход три 32-битных слова, и по ним вычисляет одно 32-битное слово.&lt;br /&gt;
&lt;br /&gt;
       &amp;lt;math&amp;gt;F(X,Y,Z) = XY \lor \neg X Z&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;G(X,Y,Z) = XY \lor XZ \lor YZ&amp;lt;/math&amp;gt;&lt;br /&gt;
      &amp;lt;math&amp;gt;H(X,Y,Z) = X \oplus Y \oplus Z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждую битовую позицию &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; действует как условное выражение: если &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;; иначе &amp;lt;math&amp;gt;Z&amp;lt;/math&amp;gt;. Функция &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; могла бы быть определена с использованием &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\lor&amp;lt;/math&amp;gt;, поскольку &amp;lt;math&amp;gt;XY&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\neg XZ&amp;lt;/math&amp;gt; не могут равняться &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; одновременно. &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; действует на каждую битовую позицию как функция максимального значения: если по крайней мере в двух словах из &amp;lt;math&amp;gt;X, Y, Z&amp;lt;/math&amp;gt; соответствующие биты равны &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; выдаст &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; в этом бите, а иначе &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; выдаст бит, равный &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Интересно отметить, что если биты &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Z&amp;lt;/math&amp;gt; статистически независимы, то биты &amp;lt;math&amp;gt;F(X,Y,Z)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;G(X,Y,Z)&amp;lt;/math&amp;gt; будут также статистически независимы. Функция &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; реализует побитовый &amp;lt;math&amp;gt;xor&amp;lt;/math&amp;gt;, она обладает таким же свойством, как &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм хеширования на [[Псевдокод (язык описания алгоритмов)|абстрактном языке программирования]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
      /* Обрабатываем каждый блок из 16-ти слов */&lt;br /&gt;
      for i = 0 to N/16-1 do&lt;br /&gt;
&lt;br /&gt;
        /* Заносим i-ый блок в переменную X */&lt;br /&gt;
        for j = 0 to 15 do&lt;br /&gt;
          set X[j] to M[i*16+j].&lt;br /&gt;
        end /* конец цикла по j */&lt;br /&gt;
&lt;br /&gt;
        /* Сохраняем A как AA, B как BB, C как CC, и D как DD */&lt;br /&gt;
        AA = A&lt;br /&gt;
        BB = B&lt;br /&gt;
        CC = C&lt;br /&gt;
        DD = D&lt;br /&gt;
&lt;br /&gt;
        /* Раунд 1 */&lt;br /&gt;
        /* Пусть [abcd k s] означает следующую операцию:&lt;br /&gt;
             a = (a + F(b,c,d) + X[k]) &amp;lt;&amp;lt;&amp;lt; s. */&lt;br /&gt;
        /* Производим 16 следующих операций: */&lt;br /&gt;
        [ABCD  0  3]  [DABC  1  7]  [CDAB  2 11]  [BCDA  3 19]&lt;br /&gt;
        [ABCD  4  3]  [DABC  5  7]  [CDAB  6 11]  [BCDA  7 19]&lt;br /&gt;
        [ABCD  8  3]  [DABC  9  7]  [CDAB 10 11]  [BCDA 11 19]&lt;br /&gt;
        [ABCD 12  3]  [DABC 13  7]  [CDAB 14 11]  [BCDA 15 19]&lt;br /&gt;
&lt;br /&gt;
        /* Раунд 2 */&lt;br /&gt;
        /* Пусть [abcd k s] означает следующую операцию:&lt;br /&gt;
             a = (a + G(b,c,d) + X[k] + 5A827999) &amp;lt;&amp;lt;&amp;lt; s. */&lt;br /&gt;
        /* Производим 16 следующих операций: */&lt;br /&gt;
        [ABCD  0  3]  [DABC  4  5]  [CDAB  8  9]  [BCDA 12 13]&lt;br /&gt;
        [ABCD  1  3]  [DABC  5  5]  [CDAB  9  9]  [BCDA 13 13]&lt;br /&gt;
        [ABCD  2  3]  [DABC  6  5]  [CDAB 10  9]  [BCDA 14 13]&lt;br /&gt;
        [ABCD  3  3]  [DABC  7  5]  [CDAB 11  9]  [BCDA 15 13]&lt;br /&gt;
&lt;br /&gt;
        /* Раунд 3 */&lt;br /&gt;
        /* Пусть [abcd k s] означает следующую операцию:&lt;br /&gt;
             a = (a + H(b,c,d) + X[k] + 6ED9EBA1) &amp;lt;&amp;lt;&amp;lt; s. */&lt;br /&gt;
        /* Производим 16 следующих операций: */&lt;br /&gt;
        [ABCD  0  3]  [DABC  8  9]  [CDAB  4 11]  [BCDA 12 15]&lt;br /&gt;
        [ABCD  2  3]  [DABC 10  9]  [CDAB  6 11]  [BCDA 14 15]&lt;br /&gt;
        [ABCD  1  3]  [DABC  9  9]  [CDAB  5 11]  [BCDA 13 15]&lt;br /&gt;
        [ABCD  3  3]  [DABC 11  9]  [CDAB  7 11]  [BCDA 15 15]&lt;br /&gt;
&lt;br /&gt;
        /* Затем производим следующие операции сложения. (Увеличиваем значение в каждом регистре&lt;br /&gt;
           на величину, которую он имел перед началом итерации по i */&lt;br /&gt;
        A = A + AA&lt;br /&gt;
        B = B + BB&lt;br /&gt;
        C = C + CC&lt;br /&gt;
        D = D + DD&lt;br /&gt;
&lt;br /&gt;
      end /* конец цикла по i */&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Замечание.&#039;&#039;&#039; Величина 5A827999 — шестнадцатеричная 32-битная константа, первые байты — старшие. Она представляет собой [[квадратный корень из 2]]. Она же в восьмеричном представлении: 013240474631. Величина 6ED9EBA1 — шестнадцатеричная 32-битная константа, первые байты — старшие. Она представляет собой квадратный корень из 3. Она же в восьмеричном представлении: 015666365641. Эти данные приведены в книге [[Искусство программирования|Кнут, Искусство программирования]], издание 1981 года, том 2, стр 660, таблица 2.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 5. Формирование хеша. ===&lt;br /&gt;
Результат (хеш-функция) получается как ABCD. То есть, мы выписываем 128 бит, начиная с младшего бита A, и заканчивая старшим битом D.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма на языке [[Си (язык программирования)|C]] содержится в RFC 1320.&lt;br /&gt;
&lt;br /&gt;
== Примеры хешей ==&lt;br /&gt;
128-битные MD4 хеши представляют собой 32-значное число в 16-ричном формате. В следующем примере показан хеш 43-байтной строки [[ASCII]]:&lt;br /&gt;
&lt;br /&gt;
 MD4(&amp;quot;[[The quick brown fox jumps over the lazy dog]]&amp;quot;) &lt;br /&gt;
  = 1bee69a46ba811185c194762abaeae90&lt;br /&gt;
&lt;br /&gt;
Любое даже самое незначительное изменение хешируемой информации приводит к получению полностью отличного хеша, например, изменение в примере одной буквы с &amp;lt;tt&amp;gt;d&amp;lt;/tt&amp;gt; на &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 MD4(&amp;quot;The quick brown fox jumps over the lazy &#039;&#039;&#039;c&#039;&#039;&#039;og&amp;quot;) &lt;br /&gt;
  = b86e130ce7028da59e672d56ad0113df&lt;br /&gt;
&lt;br /&gt;
Пример MD4 хеша для «нулевой» строки:&lt;br /&gt;
&lt;br /&gt;
 MD4(&amp;quot;&amp;quot;) = 31d6cfe0d16ae931b73c59d7e0c089c0&lt;br /&gt;
&lt;br /&gt;
== Сравнение с MD5 ==&lt;br /&gt;
* MD4 использует три цикла из 16 шагов каждый, в то время как MD5 использует четыре цикла из 16 шагов каждый.&lt;br /&gt;
&lt;br /&gt;
* В MD4 дополнительная константа в первом цикле не применяется. Аналогичная дополнительная константа используется для каждого из шагов во втором цикле. Другая дополнительная константа используется для каждого из шагов в третьем цикле. В MD5 различные дополнительные константы, Т[i], применяются для каждого из 64 шагов.&lt;br /&gt;
&lt;br /&gt;
* MD5 использует четыре элементарные логические функции, по одной на каждом цикле, по сравнению с тремя в MD4, по одной на каждом цикле.&lt;br /&gt;
&lt;br /&gt;
* В MD5 на каждом шаге текущий результат складывается с результатом предыдущего шага. Например, результатом первого шага является измененное слово А. Результат второго шага хранится в D и образуется добавлением А к циклически сдвинутому влево на определенное число бит результату элементарной функции. Аналогично, результат третьего шага хранится в С и образуется добавлением D к циклически сдвинутому влево результату элементарной функции. MD4 это последнее сложение не включает.&lt;br /&gt;
&lt;br /&gt;
== Безопасность ==&lt;br /&gt;
Уровень безопасности, закладывавшийся в MD4, был рассчитан на создание достаточно устойчивых гибридных систем [[Электронная подпись|электронной цифровой подписи]], основанных на MD4 и криптосистеме с открытым ключом. [[Рональд Ривест]] считал, что алгоритм хеширования MD4 можно использовать и для систем, нуждающихся в сильной [[Криптографическая стойкость|криптостойкости]]. Но в то же время он отмечал, что MD4 создавался прежде всего как очень быстрый алгоритм хеширования, поэтому он может быть плох в плане криптостойкости. Как показали последовавшие исследования, он был прав, и для приложений, где важна прежде всего криптостойкость, стал использоваться алгоритм [[MD5]].&lt;br /&gt;
&lt;br /&gt;
== Уязвимости ==&lt;br /&gt;
Уязвимости в MD4 были продемонстрированы в статье Берта ден Бура и Антона Босселарса в 1991 году. Первая коллизия была найдена Гансом Доббертином в 1996 году.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[MD2]]&lt;br /&gt;
* [[MD5]]&lt;br /&gt;
* [[HAVAL]]&lt;br /&gt;
* [[SHA-1]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* RFC 1186&lt;br /&gt;
* RFC 1320&lt;br /&gt;
&lt;br /&gt;
=== Поиск коллизий ===&lt;br /&gt;
* [http://eprint.iacr.org/2005/151.pdf Improved Collision Attack on MD4]&lt;br /&gt;
&lt;br /&gt;
{{Хеш-алгоритмы}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Криптографические хеш-функции]]&lt;/div&gt;</summary>
		<author><name>188.162.229.137</name></author>
	</entry>
</feed>