Наткнулся я тут однажды на одну ссылку: http://passcracking[dot]ru
И что-то мне грустно стало. Ну вот кому не понравился этот алгоритм, не знаю. Теперь придёться ломать голову...
Кое-что из истории:
Цитата:
RSA (Rivest-Shamir-Adelman) является наиболее известным алгоритмом с открытым ключом. Может использоваться как для шифрования, так и для создания подписи. Считается, что алгоритм надежен при использовании достаточно длинных ключей (значение 512 бит считается недостаточным, 768 бит - умеренно надежным, 1024 бит - хорошим). Безопасность RSA основана на проблеме факторизации больших целых чисел. Существенные продвижения в способах факторизации больших чисел могут сделать метод RSA уязвимым. В настоящее время, 512-битные ключи считаются слабозащищенными, 1024-битные ключи вероятно подходят для большинства практических целей, 2048-битные ключи будут безопасны для использования в течении десятилетий.
Видимо ещё не так всё плохо... посмотрим что из себя представляет сам md5:
Цитата:
MD5 (Message Digest Algorithm 5) представляет собой алгоритм хэширования, разработанный компанией RSA Data Security, Inc. Он может использоваться для хэширования строки байт произвольной длины в 128-битное значение. MD5 широко используется и считается достаточно надежным.
Функция хэширования H представляет собой отображение, на вход которого подаётся сообщение M произвольной длины, а на выходе получается значение h конечной длины, где h = H(M).
В общем случае хэш-значение h гораздо меньше исходного сообщения M. Так для MD5 h=128 бит. Хэш-функция должна обладать следующими свойствами:
1. По достаточно большому сообщению M хэш-функция должна быстро вычислить h значение, которое должно зависеть от каждого бита сообщения M.
2. Необратимость: по h значению невозможно восстановить исходный текст M
3. Вычислительно очень трудно (почти невозможно) найти два сообщения M и M1, которые дают два одинаковых h-значения.
Хэш-значение является контрольной суммой исходного сообщения M и называется MDC (Manipulation Detection Code - код обнаружения изменений) или MIC (Message Integrity Check - проверка целостности сообщения). Если хэш-функция использует для своей работы ключ (пароль), то получаемое значение называется MAC (Message Authentication Code - код аутентичности сообщения).Подробное официальное описание MD5 даётся в RFC 1321.
Функция хэширования H представляет собой отображение, на вход которого подаётся сообщение M произвольной длины, а на выходе получается значение h конечной длины, где h = H(M).
В общем случае хэш-значение h гораздо меньше исходного сообщения M. Так для MD5 h=128 бит. Хэш-функция должна обладать следующими свойствами:
1. По достаточно большому сообщению M хэш-функция должна быстро вычислить h значение, которое должно зависеть от каждого бита сообщения M.
2. Необратимость: по h значению невозможно восстановить исходный текст M
3. Вычислительно очень трудно (почти невозможно) найти два сообщения M и M1, которые дают два одинаковых h-значения.
Хэш-значение является контрольной суммой исходного сообщения M и называется MDC (Manipulation Detection Code - код обнаружения изменений) или MIC (Message Integrity Check - проверка целостности сообщения). Если хэш-функция использует для своей работы ключ (пароль), то получаемое значение называется MAC (Message Authentication Code - код аутентичности сообщения).Подробное официальное описание MD5 даётся в RFC 1321.
По RFC примерный алгоритм шифрования состоит из последовательностей:
Шаг 1: выравнивание потока.
Входной поток выравнивается так, что бы его длина стала конгруэнтной (сравнимой) с 448 по модулю 512. Выравнивание происходит следующим образом: к потоку добавляется один бит '1', а затем биты '0' до тех пор, пока длина потока не будет сравнима с 448 по модулю 512. Выравнивание происходит всегда, даже если длина потока была уже сравнима с 448 по модулю 512. Таким образом к потоку добавляется минимум 1 бит, максимум - 512.
Шаг 2: добавление длины.
64 битное представление длины входного потока (длины потока до выравниваия) добавляется к результату предидущего шага. Если длина потока превосходит 2^64, то добавляются младшие 64 бит. Эти биты добавляются как 2 32-битных слова, младшее слово добавляется первым. Таким образом на этом шаге длина потока становится кратной 512 битам или 16 32-битным словам. Далее будем рассматривать входной поток как массив M[0 ... N-1] слов длиной N.
Шаг 3: инициализация MD буфера.
Буфер из 4 слов {A, B, C, D} используется для вычисления хэш функции, который инициализируется в следующие значения:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
Шаг 4: обработка потока блоками по 16 слов.
Определим четыре вспомогательные функции, каждая из которых принимает три параметра размеров в слово и производит результат - слово.
F(x, y, z) = (x & y) | (~x & z)
G(x, y, z) = (x & z) | (y & ~z)
H(x, y, z) = x ^ y ^ z
I(x, y, z) = y ^ (x | ~z)
Напомним, что & - побитовое И, | - побитовое ИЛИ, ^ - побитовое исключающее ИЛИ, ~ - побитовое отрицание. Функция F для каждого бита дает следующий результат: если X, то Y, иначе Z.
На этом шаге также используется таблица T[1..64], которая построена с помощью функции синуса:
T[1] = int(4294967296 * abs(sin(i))), где int() - целая часть. Например:
T[1] = int(4294967296 * abs(sin(i))) = int(3614090360,282...) = 3614090360.
Шаг 5: вывод MD5.
Результат вычисления (хэш) представлен четырьмя 32 битными словами -A, B, C, D (младшим записывается A, старшим - D). 128-битный MD5 хэш готов!