Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Ключик к сердцу

Chingachguk/HI-TECH

Спецвыпуск: Хакер, номер #057, стр. 057-094-9


Существуют также такие специфические функции ключа, как проверка статуса (~IsKeyHere) и таймер ключа. Обычно они идут первыми в снятых логах. Защита проверяет работу таймера ключа, которую сложно повторить в эмуляторе и т.п. Однако стержнем многих ключей является некая "секретная функция", каких всего одна-две из всего набора функций ключа (для мощных ключей порядка десятков).

Общий вид секретной функции может быть записан так:

OutData Key_TransData(? *EntryData)

{

...

}

Функция Key_TransData выполняет секретное преобразование некоторого количества EntryData->OutData. Что означает "секретное"? Реверсер может добраться до самого нижнего уровня обмена с ключом, но увидит только работу этой функции. Вся ее логика зашита в ключе, алгоритм считается абсолютно не известным с точностью до анализа прошивки. Пищей для криптоанализа является неограниченное количество запросов-ответов (EntryData, OutData), его методы - все методы криптоанализа и поиски "случайно оставленных" элементов функции Key_TransData в... коде защиты. Да, это совершенно реальный случай: один из ключей был "сломан" именно так: внутри одного из драйверов защиты находился особо не прикрытый код Key_TransData...

Пример секретной функции

В большинстве случаев в первую очередь следует обращать внимание на простейшие криптографические генераторы псевдослучайных последовательностей. Чаще всего применяются конгруэнтные генераторы (видимо, они уже ушли в прошлое) и LFSR:

; Конгруэнтный генератор имеет вид:

Gi+1=(a*Gi+c) mod m

; LFSR может иметь следующий вид:

UINT LFSR, NextHighBit;

NextHighBit= ((LFSR>>t1)^(LFSR>>t2)^(LFSR>>t3)...)&0x01;

// Шаг LFSR

LFSR= (LFSR>>1)|(NextHighBitgt<<N);

; LFSR может также иметь такой вид:

UINT LFSR, TAPS;

// Шаг LFSR

LFSR^= 1;

LFSR= (LFSR>>1)|(LFSR<<N);

if (LFSR&(0x01<<N)) LFSR^= TAPS;

LFSR - один из самых распространенных элементов как в криптографии, так и в криптодевайсах. Он легко реализуется аппаратно, поэтому, видимо, часто используется в сравнительно недорогих устройствах (ключи стоят десятки долларов, а сами чипы - всего несколько зеленых). N - разрядность регистра сдвига (lfSR) в битах минус 1 (допустим, для восьмиразрядного регистра сдвига N=7), t1..tk или TAPS для второго типа LFSR - "тапы" или отводы битов из LFSR в некотором состоянии. Допустим, для первого случая t1=0 и t2=2, что означает, что на каждом шаге берут биты 0 и 2 из LFSR. Их результат ксорится и заносится в старший бит LFSR, сам же он предварительно сдвигается вправо (непосредственно бит 0 теряется). При правильном выборе TAPS или t1..tk LFSR с произвольным начальным заполнением проходит порядка 2^(N+1)-1 состояний (для N=7 это 2^8-1=255). Его состояния - псевдослучайные числа, которые можно использовать в криптографических алгоритмах. Не хочу сказать, что всякий ключ состоит из одного такого элемента: как правило, это каскад из LFSR'ов.

Даже если алгоритм "секретной функции" ключа известен, праздновать победу еще рано. Существует также подзадача определения секретных параметров алгоритма (фактически - ключей шифрования), которые не могут быть считаны из ключа иначе как изучением прошивки или же криптоанализом запросов-ответов секретной функции. Эта задача менее сложная, чем определение секретной функции ключа, но только до того момента, пока разработчик ключа не внесет внутрь ключа какой-нибудь надежный криптоалгоритм, например DES. В этом случае он даже может декларировать свою "секретную функцию" публично: ему незачем скрывать проверенный алгоритм! Однако ключ шифрования для DES ему лучше скрыть.

Назад на стр. 057-094-8  Содержание  Вперед на стр. 057-094-10