N-Hash

N-Hash
Создан 1990
Опубликован 1990
Размер хеша 128 бит
Число раундов 12 или 15
Тип хеш-функция

N-Hash — криптографическая хеш-функция на основе циклической функции FEAL. В настоящее время считается небезопасной[1].

Была разработана в 1990 году фирмой Nippon Telegraph and Telephone (также разработавшей FEAL).

Изначально, функция N-Hash была предназначена для того, чтобы решить проблему подмены информации на пути между двумя пользователями телефонной связи (Nippon Telegraph and Telephone — телекоммуникационная компания) и ускорить поиск данных. Например, если человек посылает смс-сообщение, то перед доставкой оно будет проверено на подлинность с помощью хеш-функции. А если пользователю продукции Nippon Telegraph and Telephone надо быстро найти в телефоне чей-либо контакт, то с помощью N-Hash можно упростить процесс поиска имени в списке. Это осуществляется благодаря тому, что хеш-кодом (маленькой по объёму определяющей частью контакта) имени объявляется первая буква контакта.

История возникновения

В основе алгоритма N-Hash лежит блочный алгоритм шифрования FEAL. Крупнейшая телекоммуникационная компания Nippon Telegraph and Telephone создала FEAL на основе DES. Но хотя этот алгоритм и выигрывает в быстродействии у DES, он является очень ненадежным и легко уязвимым: криптоаналитику требовалось очень мало информации, чтобы взломать алгоритм. Именно взлом алгоритма FEAL повлек за собой появление хеш-функции N-Hash в 1990 году. N-Hash также выигрывает в скорости у DES: по сравнению с 9 Кбит/сек у DES, N-Hash работает со скоростью 24 Кбит/сек для 15-раундовой схемы и со скоростью 29 Кбит/сек для 12-раундовой. При этом Nippon Telegraph and Telephone добилась повышения надёжности по сравнению с FEAL[1].

В течение некоторого времени алгоритм N-Hash использовался фирмой Nippon Telegraph and Telephone в соответствии с целями данной функции, но через некоторое время был разработан метод дней рождения, который с лёгкостью взламывал этот алгоритм. В связи со взломом отказались не только от N-Hash, но и почти от всех функций, основанных на блочных шифрах, так как для всех них характерна одна и та же проблема: они легко уязвимы методом дней рождения. Вместо них теперь используют более надежные функции, основанные на MD — технологиях: MD5, SHA-1 и другие, приведенные в списке функций, которые на данный момент считаются надежными (согласно стандарту ISO/IEC 10118).

Использование

Функция N-Hash использовалась в течение недолгого времени в начале 1990-х годов, пока не была взломана методом дней рождения.

  • N-Hash предназначалась для решения проблемы подмены данных:
    • Для современного человека эта проблема может легко быть описана на примере взаимодействия человека и интернет-магазина. Когда пользователь заказывает какой-нибудь товар в интернет-магазине, то магазин присылает ему номер заказа, сумму платежа и т. д. Далее, когда пользователь пытается оплатить заказ с помощью, например, Webmoney, то Webmoney вычисляет хеш-код полученного сообщения и сравнивает его с хеш-кодом, полученным от интернет-магазина. Если эти хеш-коды совпадают, то информация, присланная пользователем, правдива. Если не совпадают, то информация определяется как ложная и платеж не проходит.
  • Другой вариант использования прост: упорядочивание контактов в мобильном телефоне по алфавиту и поиск контакта по первой букве. Хеш-кодом имени выбирается первая буква этого имени, следовательно, когда человек нажимает некоторую букву в своем телефоне, то ищется хеш-код, который совпадает с этой буквой и на экран выводятся контакты, начинающиеся с неё.

Особенности N-Hash

Однонаправленность

Определение: Пусть M {\displaystyle M}  — сообщение некоторой длины.

Функция H {\displaystyle H} называется однонаправленной, если из равенства h = H ( M ) {\displaystyle h=H(M)}

легко:

  • найти хеш-код h {\displaystyle h} , зная сообщение M {\displaystyle M}

очень трудоёмко:

  • найти сообщение M {\displaystyle M} по известному хеш-коду h {\displaystyle h} (т. е. если хеш-код пароля стал известен хакеру, то пароль он по нему не найдет);
  • найти отличное от M {\displaystyle M} сообщение M {\displaystyle M'} , такое что их хеш-коды H ( M ) = H ( M ) {\displaystyle H(M')=H(M)} совпадают.

Проще определение можно записать так:

Однонаправленность — это «отпечаток пальца»:

  • Если дан конкретный человек, то можно взять у него отпечаток пальца;
  • Невозможно найти человека по отпечатку его пальца (если нет базы данных с отпечатками пальцев всех людей, а её нет);
  • Невозможно найти второго человека с таким же как у другого отпечатком пальца.

Однонаправленность решает очень важную проблему. Рассмотрим её на примере.

Алиса и Боб традиционно обозначают субъектов передачи информации.
Примеры
  • Допустим, Алиса подписала контракт M {\displaystyle M} с известным Алисе и Бобу хеш-кодом h = H ( M ) {\displaystyle h=H(M)} . Если бы H {\displaystyle H} была неоднонаправленная, то Боб мог бы найти такой другой контракт M {\displaystyle M'} , что H ( M ) = H ( M ) {\displaystyle H(M')=H(M)} и, значит, смог бы утверждать, что Алиса подписала M {\displaystyle M'} .
  • Допустим, Алиса имеет один и тот же отпечаток пальца h с каким-нибудь преступником, тогда Боб смог бы утверждать, что этот преступник — Алиса.

Устойчивость к столкновениям

Чтобы предотвратить возможность Алисы использовать метод «дней рождения» для обмана Боба, очень удобно ввести ещё более сильное условие, чем условие однонаправленности. H такова, что трудно найти сообщения M {\displaystyle M} и M {\displaystyle M'} , такие что их хеш-коды H ( M ) = H ( M ) {\displaystyle H(M)=H(M')} совпадают. То есть невозможно найти двух человек с одинаковыми отпечатками пальцев.

Данное условие называется устойчивостью к столкновениям и для хеш-функции N-Hash оно не выполняется.

По причине неустойчивости к столкновениям Алиса может обмануть Боба таким образом (метод «дней рождения»):

  • Алиса пишет две версии контракта: одна из них выгодна для Боба, а другая нет;
  • Внося небольшие изменения в каждый контракт (например, пробел заменяет на два пробела), она добьется того, что версий контрактов будет достаточно много для подбора M {\displaystyle M} и M {\displaystyle M'} , для которых совпадают хеш-коды (версия M {\displaystyle M} выгодна Бобу, а M {\displaystyle M'}  — нет) (если в контракте 34 строки, то, внося или не внося изменения в каждую из строк, легко получить 2 34 {\displaystyle 2^{34}} версий контрактов);
  • Теперь Алиса сможет доказать, что Боб подписал M {\displaystyle M'} .

Для того, чтобы избежать подобной проблемы, достаточно вносить косметические изменения в подписываемый контракт. И хотя это действие никак не изменяет хеш-функцию H, а, значит, никак не влияет на её устойчивость к столкновениям, но человек этим действием получит новую версию контракта, хеш-код которого не совпадает с хеш-кодом версии контракта злоумышленника. То есть, если Боб в 5-й строке поставит в каком-нибудь месте запятую, или поставит две точки вместо одной, то Алиса не сможет доказать, что он подписал другой контракт (так как его хеш-код уже не совпадает с хеш-кодом контракта Алисы).

Можно рассмотреть жизненный пример: когда нотариус ставит печать в подписываемый контракт, он вносит туда косметические изменения.

Цели N-Hash

Для того, чтобы понять как работает функция N-Hash, необходимо перейти на более научную речь. Ниже приведены цели данной функции не на примерах, а в соответствии с тем, как они осуществляются и с соответствующей терминологией.

  • Обеспечение целостности информации[1]:

Данное свойство необходимо для того, чтобы исключить возможность злоумышленника внедрить некоторую ложную информацию в исходное сообщение. Для обеспечения целостности должна быть возможность обнаружить любые изменения в тексте сообщения (замена, вставка, удаление). Целостность обеспечивается путём внедрения в исходное сообщение избыточной информации, которая будет являться проверочной комбинацией. Такая комбинация называется контрольной суммой и её можно вычислить с помощью специального алгоритма. Так как этот алгоритм зависит от секретного ключа, то внедрение ложной информации в сообщение маловероятно.

M n e w = M + s a l t {\displaystyle M_{new}=M+''salt''} , где salt — избыточная информация, M — сообщение H ( s a l t ) = S {\displaystyle H(salt)=S} - контрольная сумма;

Из формулы следует, что если меняется salt, то меняется и S (контрольная сумма), а значит изменялось и M n e w {\displaystyle M_{new}} и M {\displaystyle M} .

То есть можно сделать вывод, что была добавлена ложная информация.

Функция N-Hash работает с сообщениями M произвольной длины. При этом на выходе получается хеш-код фиксированной длины в 128 бит. Это получается за счет того, что сообщение делится на блоки M i {\displaystyle M_{i}} , размером 128 бит, и алгоритм работает последовательно с каждым из блоков.

Данное свойство выполняется для однонаправленных функций, какой и является N-Hash. Достоверность сообщения M проверяется путём нахождения конечного хеш-кода (дайджеста сообщения) дважды (отсылающая и принимающая стороны). Результаты сравниваются и, если они совпадают, то информация достоверна. Целостность не гарантирует достоверность.

  • Обеспечение конфиденциальности:

на сайтах, где нужно вводить логин и пароль, пароль после ввода переводится в хеш-код. То есть изначально пользователь вводит пароль M, но для входа в защищённую область используется хеш-код h = H ( M ) {\displaystyle h=H(M)} . По известному хеш-коду h и функции H вычислить M очень трудно, чем и обеспечивается конфиденциальность пароля.

Аутентификация — это процедура проверки подлинности пользователя или данных при помощи некоторого критерия.

Возникает вопрос, как хеш-функция обеспечивает правдивость аутентификации. Это легко показать на примере.

Когда пользователь вводит логин и пароль на каком-либо сайте, его пароль преобразуется в хеш-код и передается по сети для аутентификации. Очевидно, что для того чтобы войти под чужую учётную запись достаточно выяснить хеш-код пароля, а затем по формуле h = H ( M ) {\displaystyle h=H(M)} (h-хеш-код, M — пароль) найти пароль. Но N-Hash, являющаяся однонаправленной функцией, обеспечивает сохранность пароля, так как это уравнение для однонаправленных функций решается очень трудоёмко (не с помощью персонального компьютера).

Алгоритм

Алгоритм N-Hash основан на циклическом повторении (12 или 15 раз — число раундов) операций. На входе имеется хеш-код h 0 {\displaystyle h_{0}} и он может быть произвольным, на выходе получается хеш-код h сообщения M, которое необходимо хешировать. При этом размер выходящего хеш-кода фиксирован и равен 128 бит, тогда как размер M произволен[2].

Основные обозначения

  • M {\displaystyle M}  — сообщение, которое необходимо хешировать;
  • M i {\displaystyle M_{i}}  — блок сообщения длиной 128 бит. Для того, чтобы хешировать сообщение M {\displaystyle M} необходимо поделить его на блоки M i {\displaystyle M_{i}} ;
  • h i {\displaystyle h_{i}}  — хеш-код i-го шага;
  • ν = 1010...1010 {\displaystyle \nu =1010...1010}  — константа, длиной 128 бит;
  • | | {\displaystyle ||}  — конкатенация;
  • V j = δ | | A j 1 | | δ | | A j 2 | | δ | | A j 3 | | δ | | A j 4 {\displaystyle V_{j}=\delta ||A_{j1}||\delta ||A_{j2}||\delta ||A_{j3}||\delta ||A_{j4}} , где A j k = 4 ( j 1 ) + k {\displaystyle A_{jk}=4*(j-1)+k} , где k=1, 2, 3, 4; δ = 00..00 {\displaystyle \delta =00..00} , длиной 24 бит;
  • EXG — функция, которая меняет местами старшие и младшие разряды (64 младших и 64 старших);
  • PS — преобразующая функция;

Описание алгоритма

На схеме справа представлены схематические обозначения операций, которые присутствуют на нижеследующих схемах.

  • Покоординатное (попарное) суммирование означает сложение по модулю 2;
  • Если x поступает на вход функции f, то на выходе получается f(x).

Один цикл работы N-Hash

один цикл работы N-Hash

Ниже представлен один цикл работы алгоритма N-Hash.

  • На вход функции g подается хеш-код (i-1)-го шага h i 1 {\displaystyle h_{i-1}} и i-й блок сообщения M i {\displaystyle M_{i}} . При этом h 0 {\displaystyle h_{0}} выбирается произвольно: например, он может быть нулевым. А также h i 1 {\displaystyle h_{i-1}} подается на выход на операцию сложения по модулю 2, то есть результат (хеш-код следующего шага) будет выглядеть так: h i 1 {\displaystyle h_{i-1}\oplus } (нечто пока неизвестное).
  • Из схемы видно, что M i {\displaystyle M_{i}} подается не только на XOR, но и на выход на операцию сложения по модулю 2. То есть теперь в соответствии с первым пунктом результат выглядит таким образом: h i 1 M i {\displaystyle h_{i-1}\oplus M_{i}} (оставшееся пока неизвестным нечто).

Оставшееся пока неизвестным нечто находится после прохождения каскада из восьми преобразующих функций. Его получение может быть описано таким образом:

  • Функция EXG меняет местами старшие и младшие разряды h i 1 {\displaystyle h_{i-1}} и прибавляет к результату ν {\displaystyle \nu } , после чего результат складывает по модулю 2 с M i {\displaystyle M_{i}} .
  • Как видно из схемы, результат подается последовательно на входы j преобразующих функций, вторым аргументом которых является сумма h i 1 V j {\displaystyle h_{i-1}\oplus V_{j}} , где j=1, … , 8.
  • В результате получается хеш-код i-го шага h i {\displaystyle h_{i}} :

h i = M i g ( M i , h i 1 ) h i 1 {\displaystyle h_{i}=M_{i}\oplus g(M_{i},h_{i-1})\oplus h_{i-1}} .

Преобразующая функция

Схема преобразующей функции. Каждый из аргументов разбивается на 4 блока по 32 бит каждый.

Возникает вопрос, как действует преобразующая функция P S ( X , P ) {\displaystyle PS(X,P)} .

Рассмотрим верхнюю часть схемы до перекрестья.

Исходное сообщение X {\displaystyle X} разбивается на блоки по 128 / 4 = 32 {\displaystyle 128/4=32} бита.

Будем считать промежуточными выходами входы в нижнюю часть схемы. X 1 {\displaystyle X_{1}} и X 2 {\displaystyle X_{2}} подаются на промежуточные выходы, а на два других выхода подаются операции f ( X 1 , P 1 ) X 2 X 4 {\displaystyle f(X_{1},P_{1})\oplus X_{2}\oplus X_{4}} и f [ f ( X 1 , P 1 ) X 2 , P 2 ] X 1 X 3 {\displaystyle f[f(X_{1},P_{1})\oplus X_{2},P_{2}]\oplus X_{1}\oplus X_{3}} . Теперь можно результаты на промежуточных выходах переобозначить и через них, аналогично верхней части, найти результаты на выходе нижней части, то есть и всей схемы в целом.

Сделав все необходимые вычисления, получим, что при подаче на вход X = X 1 X 2 X 3 X 4 {\displaystyle {X=X_{1}\parallel X_{2}\parallel X_{3}\parallel X_{4}}} сообщение на выходе Y = Y 1 Y 2 Y 3 Y 4 {\displaystyle {Y=Y_{1}\parallel Y_{2}\parallel Y_{3}\parallel Y_{4}}} можно представить как конкатенацию сообщений

  • Y 4 = X 2 X 4 f ( X 1 , P 1 ) {\displaystyle {Y_{4}=X_{2}\oplus X_{4}\oplus f(X_{1},P_{1})}} ;
  • Y 3 = f [ f ( X 1 , P 1 ) X 2 , P 2 ] X 1 X 3 {\displaystyle {Y_{3}=f[f(X_{1},P_{1})\oplus X_{2},P_{2}]\oplus X_{1}\oplus X_{3}}} ;
  • Y 2 = X 2 Y 4 f ( Y 3 , P 3 ) {\displaystyle {Y_{2}=X_{2}\oplus Y_{4}\oplus f(Y_{3},P_{3})}} ;
  • Y 1 = f [ f ( Y 3 , P 3 ) Y 4 , P 4 ] X 1 Y 3 {\displaystyle {Y_{1}=f[f(Y_{3},P_{3})\oplus Y_{4},P_{4}]\oplus X_{1}\oplus Y_{3}}} .

Поиск функции f(x, P)

Схема поиска функции f(x ,P)

Так как функция f работает с аргументами, длина которых составляет 32 бит, то из схемы поиска функции f(x, P) имеем:

  • Величину x P {\displaystyle x\oplus P} разбиваем на части по 8 бит.
  • Запишем эти части как x i P i {\displaystyle x_{i}\oplus P_{i}} , i=1,…,4 и введёт новые обозначения:
    • Z 1 = x 1 P 1 {\displaystyle {Z_{1}=x_{1}\oplus P_{1}}} ;
    • Z 2 = x 2 P 2 {\displaystyle {Z_{2}=x_{2}\oplus P_{2}}} ;
    • Z 3 = x 3 P 3 {\displaystyle {Z_{3}=x_{3}\oplus P_{3}}} ;
    • Z 4 = x 4 P 4 {\displaystyle {Z_{4}=x_{4}\oplus P_{4}}} ;

Аргументами функции S 0 {\displaystyle {S_{0}}} (первая стрелка слева) являются Z 1 {\displaystyle Z_{1}} и S 1 [ Z 1 Z 2 , Z 3 Z 4 ] {\displaystyle {S_{1}[Z_{1}\oplus Z_{2},Z_{3}\oplus Z_{4}]}} .

Аргументами функции S 1 {\displaystyle {S_{1}}} (вторая стрелка слева) являются Z 1 Z 2 {\displaystyle {Z_{1}\oplus Z_{2}}} и Z 3 Z 4 {\displaystyle {Z_{3}\oplus Z_{4}}} .

То есть две составляющие части из сообщения на выходе уже известны и равны

    • A 1 = S 0 ( Z 1 , S 1 [ Z 1 Z 2 , Z 3 Z 4 ] ) {\displaystyle {A_{1}=S_{0}(Z_{1},S_{1}[Z_{1}\oplus Z_{2},Z_{3}\oplus Z_{4}])}} ;
    • A 2 = S 1 [ Z 1 Z 2 , Z 3 Z 4 ] {\displaystyle {A_{2}=S_{1}[Z_{1}\oplus Z_{2},Z_{3}\oplus Z_{4}]}} ;

Далее будем пользоваться уже полученными оставляющими частями сообщения на выходе для удобства записи:

    • A 3 = S 0 [ Z 3 Z 4 , A 2 ] {\displaystyle {A_{3}=S_{0}[Z_{3}\oplus Z_{4},A_{2}]}} ;
    •   A 4 = S 1 [ Z 4 , A 3 ] {\displaystyle {~A_{4}=S_{1}[Z_{4},A_{3}]}} ;
  • Тогда сообщение на выходе можно представить в виде A = A 1 | | A 2 | | A 3 | | A 4 {\displaystyle {A=A_{1}||A_{2}||A_{3}||A_{4}}} .
  • Причём известно, что
    • S 0 {\displaystyle {S_{0}}} =(левый циклический сдвиг на 2 бита)(a+b) mod 256
    • S 1 {\displaystyle {S_{1}}} =(левый циклический сдвиг на 2 бита)(a+b+1) mod 256

Безопасность хеш-функций

Хеш-функция является безопасной в случае, когда криптоаналитику требуется очень много информации, для того чтобы взломать данную хеш-функцию (что делает взлом маловероятным) и если хеш-функция не взломана к данному времени[3].

Для того, чтобы хеш-функция была безопасной, необходимо, чтобы выполнялись условия:

  • При изменениях в тексте сообщения M {\displaystyle M} (вставки, перестановки и т. д.) должен меняться и хеш-код сообщения;

Иначе человек, который вводит свои логин и пароль для входа в Википедию, мог бы попасть на страницу другого участника.

  • Невозможность нахождения сообщения M {\displaystyle M} по известному хеш-коду h {\displaystyle h} из h = H ( M ) {\displaystyle h=H(M)} ;

Если данное условие не выполняется, то это делает возможным нахождение паролей пользователей Википедии.

  • Задача нахождения сообщений M 1 {\displaystyle M_{1}} и M 2 {\displaystyle M_{2}} , таких что их хеш-коды равны h 1 = h 2 {\displaystyle h_{1}=h_{2}} должна быть очень трудоёмкой.

Иначе, можно было бы найти два пароля с одинаковыми хеш-кодами.

N-Hash не является безопасной функцией, так как для неё не выполнено последнее условие.

Криптоанализ N-Hash

В настоящее время N-Hash считается небезопасной функцией. На данном рисунке указаны все безопасные однонаправленные функции на данный момент согласно стандарту ISO/IEC 10118[1]:

Из алгоритмов, построенных как и N-Hash на основе блочных шифров, безопасными считаются только MDC-2 и MDC-4.

Для N-Hash характерна следующая проблема:

  • Так как длина хеш-кода равна длине блока алгоритма шифрования, то алгоритм нестоек перед атакой методом «дней рождения».

Атаки на хеш-функции

На данном рисунке приведена классификация атак на все алгоритмы хеширования в целом.

Атаки, зависящие от алгоритма, являются атаками, основанными на свойствах конкретного алгоритма.

Например, N-Hash успешно атакуют с помощью дифференциального метода, атакой с фиксированной точкой и встречей посередине.

Атаки, не зависящие от алгоритма, можно применить к любой функции хеширования, однако это не исключает того, что для некоторых алгоритмов они очень трудоёмки из-за большого объёма информации или быстродействия кода.

Действенные атаки на N-Hash

Атаки, базирующиеся на уязвимости алгоритма
Дифференциальный метод

Ден Бур предложил способ построения коллизии для однораундовой схемы N-Hash.

Бихам и Шамир успешно применили метод дифференциального криптоанализа для компрометации 6-раундовой схемы N-Hash. Предложенный ими способ построения коллизии срабатывает для любого значения N кратного трём и при этом для N ≤ 12 он оказывается эффективнее подхода, основанного на парадоксе дней рождения.

Для 12-раундовой схемы сложность построения коллизий предложенным методом оценивается величиной 256 операций (трудоёмкость метода, основанного на парадоксе дней рождения — 264 операций).

Атаки, не зависящие от алгоритма

Увеличение длины хеш-кода и секретного ключа усложнит работу криптоаналитика. Можно попытаться сделать вычисления слишком трудоёмкими для персонального компьютера и требующими больших ресурсов. Тогда криптоаналитику надо будет или искать суперкомпьютер, или написать вирус, который на основе распараллеливания процесса взлома хеш-функции будет использовать сразу несколько персональных компьютеров для решения проблемы[3].

Также действенны такие методы защиты хеш-функции[4]:

  • использование контрольных сумм на разных этапах хеширования;
  • проверка на достоверность информации;
  • внедрение в сообщение информации типа salt.

Итоги

  • В настоящее время N-Hash мало распространён, так как не является безопасным и взломан более 10 лет назад.
  • Теперь для хеш-функций типа N-Hash существует специальное название — ключевые, то есть однонаправленные, но не устойчивые к столкновениям:
    • Если стороны доверяют друг другу (то есть каждая из сторон уверена, что другая не станет подменять контракт как в случае с Алисой и Бобом), то можно использовать N-Hash.

Сравнение N-Hash с другими хеш-функциями

Алгоритм Длина хеш-значения Скорость шифрования (Кбайт/сек)
Одновременная схема Davies-Meyer (c IDEA) 128 22
Davies-Meyer (с DES) 64 9
Хеш-функция ГОСТ 256 11
HAVAL (3 подхода) переменная 168
HAVAL (4 подхода) переменная 118
HAVAL (5 подходов) переменная 98
MD2 128 23
MD4 128 236
MD5 128 174
N-Hash (12 этапов) 128 29
N-Hash (15 этапов) 128 24
RIPE-MD 128 182
SHA-1 160 75
Snefru (4 прохода) 128 48
Snefru (8 подходов) 128 23

Примечания

  1. 1 2 3 4 5 Хеш-функции  (неопр.). Криптомаш. Дата обращения: 27 ноября 2008. (недоступная ссылка)
  2. Брюс Шнайер. Глава 18. Однонаправленные хеш-функции // Прикладная криптография. — 2-е изд. Архивировано 28 февраля 2014 года.Архивная копия от 28 февраля 2014 на Wayback Machine
  3. 1 2 Основной вопрос криптографии // CIO : журнал. — 17 мая 2005. — № 5. Архивировано 29 мая 2008 года.
  4. Криптоанализ хеш-функций  (неопр.). Криптомаш. Дата обращения: 27 ноября 2008. (недоступная ссылка)

См. также

Ссылки

  • Современное хеширование
  • Аутентификация данных и электронная цифровая подпись

Литература

  • А. Щербаков, А. Домашев. Прикладная криптография. — М.: Русская Редакция, 2003. — 404 с. — ISBN 5-7502-0215-1.
  • Брюс Шнайер. Прикладная криптография. — 2-е изд. — М.: Триумф, 2002. — 816 с.
Перейти к шаблону «Хеш-алгоритмы»
Общего назначения
Криптографические
Функции формирования ключа
Контрольное число (сравнение)
Применение хешей