Пусть N обозначает множество символов, потенциально входящих в пароль, тогда, очевидно, чтобы гарантировано найти пароль единичной длины потребуется перебрать N вариантов. А из двух символов можно составить N*N+N комбинаций. Доказать это утверждение можно несколькими способами.
Например, так: поскольку каждый символ пароля можно представить в виде цифры, то и сам пароль можно изобразить в форме числа. Если символы пароля представляют собой ряд натуральных чисел от 1 до N, то, следовательно, каждый пароль численно совпадет со своим индексом, а количество паролей окажется равно значению максимального индекса.
Любое натуральное число можно представить в виде следующей суммы степеней: N1+N2+NL,… где L - количество цифр в числе (т.е. в данном случае длина пароля). Отсюда, если длина пароля равна двум, то всего существует N1+N2 возможных паролей, что и требовалось доказать. Если же учитывать вероятность отсутствия пароля, то к этой формуле придется добавить единицу, таким образом, получится следующий результат:
???? t = V * (N0+N1+N2+NL)
По этой формуле можно вычислить время, необходимое для поиска пароля в худшем случае. Однако, вероятность, что искомый пароль окажется самым последним перебираемым вариантом равна вероятности угадать правильный ответ с первой попытки. Поэтому, точно вычислить требуемое время невозможно (это кому как повезет), но принято говорить о времени, необходимом в среднем случае. Оно вычисляется по следующей формуле: tср =tмакс /2.
В некоторых публикациях (например «Моделирование возможности компьютерной атаки нарушителями через систему паролей» Головин Д. В.) затрагивается вопрос, - какой поиск пароля дает наилучший результат - последовательный или хаотичный. На самом деле вопрос нелеп в своей постановке, поскольку не оговаривается, откуда и как возник искомый пароль. Если принять, что он был выбран случайно, то последовательной перебор вариантов будет ничем не хуже (и не лучше) хаотичного поиска, поскольку никаких сведений (ни явных, ни предполагаемых) об искомом паролей нет и одному методу поиска нельзя отдать предпочтение перед другим [337].
Однако выбрать абсолютно случайный пароль прямо-таки затруднительно. Большинство генераторов случайных чисел имеют дефекты, иногда весьма значительные и хотя результат выдаваемый ими результат нельзя предсказать, можно оценить его вероятность.
Если достоверно известно с помощью какого алгоритма был получен исходный пароль то, использовав тот же самый алгоритм в переборщике, можно попытаться несколько сократить требуемое количество попыток. Но при этом возникнет трудность с предотвращением повторных проверок одного и того же пароля. Большинство алгоритмов допускают неоднократное появление один и тех же значений даже в интервале не превышающего периода генерации, поэтому каждый выданный пароль придется где-то сохранять и проверять на уникальность. Все это требует накладных расходов, значительно превышающих выгоды использования дефектов генератора случайных чисел (если только используемый генератор не кривой как бумеранг).
Поэтому, в большинстве случаев используется простой линейный поиск, заключающийся в последовательном переборе возможных паролей один за другим. Один из простейших алгоритмов перебора (получивший название «алгоритм счетчика») приведен ниже (на диске, прилагаемом к книге, он находится в файле “/SRC/gen.pswd.simple.c”):
Суть алгоритма заключается в следующем: Первый слева символ пароля увеличиваться до тех пор, пока не превысит максимально допустимое значение. Когда такое произойдет, он «обнуляется» - принимает минимально допустимое значение, а символ, стоящий справа от него инкрементируется на единицу. Происходит, так называемая, «зацепка» - точно так работает механический счетчик на шестеренках. Когда шестеренка совершает полный оборот, она задевает своим удлиненным зубчиком соседнюю, заставляя ее повернуться на одну позицию. В упрощенном виде алгоритм записывается в одной строке на языке Си:
· while ((++pswd[p])»MAX_VAL) pswd[p++]=MIN_VAL;p=0;
Такая конструкция скрывает рекурсию, и тот же алгоритм в рекурсивной форме записи может выглядеть так: