Криптография - статьи



Стандартный алгоритм восстановления паролей к PWL-файлам - часть 2


WORD Offset = (WORD *)&lpFile[0x272]; //Зашифров. адрес 1-го блока ресурсов

WORD Len = XXX; //Длина исходного PWL-файла

//

for (int i = 1; i < 35; i++)

{

A += M[i]; //Вычисляем новый индекс для обмена байтами

   t = M[i]; 

   M[i] = M[A]; //Меняем местами i-й байт и байт по вычисленному индексу A

   M[A] = t;

   //

   t = M[i] + M[A]; //Вычисляем еще один индекс

   if (i == 33)

      ((byte *)&Offset)[0] ^= M[t]; //Декодируем 1-й байт адреса

   if (i == 34)

       ((byte *)&Offset)[1] ^= M[t]; //Декодируем 2-й байт адреса

}

//

if ((Offset > 0x291) && (Offset < Len))

{

   //Есть вероятность, что пароль верный,

   //делаем полную перепроверку по пунктам 10...14

}

else

{

   //Однозначно пароль неверный, переходим на новый пароль

}

Как видим, переработка массива M все равно остается, но(!) - первые 32 итерации мы НИЧЕГО не XOR'им, а декодируем ТОЛЬКО на 33 и 34 итерациях адрес блока ресурсов.

Таким образом, зачем нам делать пункты 10...14 и проверять 16 байт, когда можно выполнить "упрощенный" вариант процедуры XorT и проверить всего 2 байта! ;)

При всем моем уважении к Microsoft, однако, это еще одна их "дыра" в реализации качественных методов хранения паролей пользователей!

Итак, что мы получили в среднем:

  • ~40 тактов на инициализацию массива M.
  • ~300 тактов на первый проход MD5.
  • ~1000 тактов на проход RC4.
  • ~150 тактов на все остальное (формирование массива Z, инкремент пароля, "упрощенная" функция XorT, проверки и пр.)
  • В итоге мы получаем суммарное время обработки одного пароля около 1500 тактов

    на всех типах процессоров, что приведены в начале статьи, кроме процессора Pentium 4. :(

    Дело в том, что микроархитектура P4 по сравнению с P-II/III была существенно переработана - увеличено время выполнения команды (до 20 стадий), изменились размеры строк кэша данных и кода и еще ряд "усовершенствований", поэтому этот код (в особенности, реализация алгоритма RC4) для P4 не является оптимальным и в следующей версии PWLInside будет модифицирован. При этом на процессорах AMD, даже последних, таких проблем не возникает - на Athlon'e XP 1700+ (1466МГц) с ядром ThoroughBred программа исправно выдает около миллиона паролей в секунду. Вот так AMD делает аналоги процессоров Intel в чем-то лучше, чем сама Intel. :)




    Содержание  Назад  Вперед