AFAIK, такие «волшебные» значения имеют следующие два свойства:
- Они как-то уникальны и выглядят случайными.
- Они могут участвовать в алгебраических операциях неоднократно; т. е. даже после многократного применения определенной операции (скажем, умножения или возведения в степень) «магическое» значение все еще способно генерировать новые значения.
Вы можете найти аналогичный случай в MD5 . Рассмотрим следующую строку:
k[i] := floor(abs(sin(i + 1)) × (2 pow 32))
Здесь sin(i + 1)
предназначен для создания магических ценностей; которые являются уникальными, случайными на вид, и могут работать для многих i
. (На самом деле, в i
диапазоне 0,63).
Редактировать: Читая оригинальную статью о ЧАЕ , каждый понимает, что ответ, данный "Стивеном Стадницким", является правильным. Обратите внимание, что волшебная константа - это имя delta:
Различные кратные дельты используются в каждом раунде, так что ни один бит кратного не будет меняться часто. Мы подозреваем, что алгоритм не очень чувствителен к значению дельты, и нам просто нужно избежать неверного значения. Следует отметить, что дельта оказывается нечетной с усечением или ближайшим округлением, поэтому не требуется никаких дополнительных мер предосторожности, чтобы гарантировать, что все цифры суммы меняются.
Поскольку используется только 32 кратных дельты (по одному на каждый раунд), не удивительно, что алгоритм не очень чувствителен к какой-либо конкретной дельте. (См. Ответ Стивена Стадницкого для получения дополнительной информации.)
Редактировать 2: Между прочим, MD4 использует квадратные корни 2 (0x5a827999) и 3 (0x6ed9eba1) в качестве «магических» констант в своих операциях. Раздел 5.4.4 книги « Сетевая безопасность: частное общение в публичном мире» хорошо объясняет это:
Чтобы показать, что разработчики не выбрали дьявольское значение константы, константа основана на квадратном корне из 2.
Это объяснение совпадает с замечанием, высказанным ниже в комментарии Жиля.