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



RC4 (2-я часть) - часть 3


- 0-й байт массива Key от 1-го пароля

- 0-й байт массива Key от 2-го пароля

...

- 0-й байт массива Key от 8-го пароля

- 1-й байт массива Key от 1-го пароля

- 1-й байт массива Key от 2-го пароля

...

- 1-й байт массива Key от 8-го пароля

и так далее.

  • И вот что получаем - теперь все 8 индексов для разных паролей хранятся в одном(!) MMX-регистре, в разных его 8-битных частях.

    Помните строчку:

    A += (M[i] + Key[i % 16]);

    Теперь этот фрагмент кода для 8-ми паролей (и ключей, соответственно) выполняется двумя MMX-командами:

  • mov edi,offset M

    mov ebp,offset Key

    ...

    pxor mm0,mm0 ;Начальные значения обнуляем

    ...

    ;Вот этот фрагмент:

    paddb mm0,qword ptr [edi] ;Все восемь A += M[i] 

    paddb mm0,qword ptr [ebp] ;Все восемь A += Key[i % 16]

    Вот в чем неоспоримое достоинство MMX-регистров - возможность оперировать с 8-, 16- или 32-битными частями всего регистра независимо друг от друга!

  • После этого выделяем байты из MM0 любым способом, формируем адреса, меняем байты в массивах M и далее все то же самое, что выше.
  • И, конечно же, инициализация массивов M будет такая же, что приведена выше - по 40 тактов на один пароль. Но 8 раз.

    Такой прием привел к тому, что на проход алгоритма RC4 на один ключ/пароль уходит ~980...1000 тактов, что означает в среднем менее 4-х тактов на обработку одного байта в массиве M!

  • А если использовать XMM-регистры, то можно анализировать 16 паролей одновременно и это даст еще прирост скорости, но только на тех процессорах, которые поддерживают набор команд SSE. Попробуйте, может следующий "прорыв" в области восстановления паролей к PWL-файлам сделаете именно Вы! ;)




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