[C++] White-box AES Implementation Generator
От: gear nuke  
Дата: 30.04.08 04:52
Оценка: 21 (3)
White-Box Cryptography — относительно новое направление (основные применения — DRM и watermarking) в сети публикаций не так много, а готовые реализации, вероятно, можно вообще не найти. Данный генератор представляет скорее академический, чем практический интерес. Это не пример, как надо делать, а на тему "что это вообще такое". Исследования стойкости не проводились. Написан в 2004 году и сейчас является Public Domain (*).

http://files.rsdn.ru/45067/aesig.zip



О программе.

AESIG создаёт программные реализации алгоритма дешифрования AES, предназначенные для работы в условиях "White-Box". Это подразумевает выполнение алгоритма в условиях, полностью контроллируемых криптоаналитиком. В такой ситуации недопустимо открытое использование секретного ключа.

White-Box AES обладает повышенной стойкостью к извлечению ключа дешифрации криптотекста. Это достигается за счёт хранения ключа в неявном виде в коде дешифратора. Дешифратор представляет собой серию табличных замен. В свою очередь каждая табличная замена компилируется в последовательность вида:
if( ! (y += XX) ) var <operator>= ZZ;
где operator представляет собой псевдослучайную арифметическую операцию.

Как это работает.

AESIG получает на вход файл сценария с параметрами. На основании информации из сценария и данных ключа генерируется листинг функции на языке Си пригодной для непосредственного использования в составе сторонней Си-программы. После компиляции эта функция способна осуществлять дешифрацию без использования каких-либо дополнительных данных.




(*) Так как под рукой нет 2003 Студии, что бы собрать exe без ненужных хависимостей, в память о почившем в бозе заказчике оставлен copyrighted бинарник. Его использование может быть незаконно.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: [C++] White-box AES Implementation Generator
От: CreatorCray  
Дата: 30.04.08 10:20
Оценка:
Здравствуйте, gear nuke, Вы писали:

Я смотрю это походу то же самое что ты на краклабе выкладывал.
Алгоритм по крайней мере тот же.

Но присутствует и неростаток! можно восстановить ключ по данным между раундами.
Просто прохорить назад с известными Td боксами и все. Или используя медленную версию AES
прохорить с инвертированным S боксом для 1-го раунда (для всех последующих нужно ещё MixColumn).
Чтоб предотвратить такое восстановление нужно ввести XOR — совместимую модификацию данных.
например перемешать биты в байтах данных и прохорить с чем-нить.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: [C++] White-box AES Implementation Generator
От: gear nuke  
Дата: 30.04.08 10:44
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Я смотрю это походу то же самое что ты на краклабе выкладывал.


Да, только это уже сам генератор, а не производный исходник.

Но присутствует и неростаток! можно восстановить ключ по данным между раундами.
Просто прохорить назад с известными Td боксами и все. Или используя медленную версию AES
прохорить с инвертированным S боксом для 1-го раунда (для всех последующих нужно ещё MixColumn).
Чтоб предотвратить такое восстановление нужно ввести XOR — совместимую модификацию данных.
например перемешать биты в байтах данных и прохорить с чем-нить.


Это твои комментарии? Сказать честно, после длительного перерыва, не вижу где в результирующем сорце все эти боксы. Вообще я несколько слукавил, "криптоанализ" был — закончилось на необходимости дезассемблера. Время слома оценили как неприемлимое для кряка для удовольствия.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: [C++] White-box AES Implementation Generator
От: CreatorCray  
Дата: 30.04.08 11:56
Оценка:
Здравствуйте, gear nuke, Вы писали:

CC>>Я смотрю это походу то же самое что ты на краклабе выкладывал.

GN>Да, только это уже сам генератор, а не производный исходник.
Но генерит точно такой же код.

GN>Это твои комментарии?

Не, не мои. Просто почитал что он генерит и вспомнил что недавно где то это уже видел.
Кстати надоб seed проинитить в начале. А то у тебя rand() всякий раз одно и то же выдает.

GN> Сказать честно, после длительного перерыва, не вижу где в результирующем сорце все эти боксы.

Я в анализе симметриков покуда себя лохом считаю, так что оценивать вообще не берусь.
Просто было интересно решал ли ты описанные тогда недочеты. И были ли они на самом деле.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: [C++] White-box AES Implementation Generator
От: gear nuke  
Дата: 30.04.08 12:54
Оценка:
Здравствуйте, CreatorCray,

Дык там параметры в файле сценария указаны, можно поменять ключ и seed... в доке расписано даже

CC>Просто было интересно решал ли ты описанные тогда недочеты. И были ли они на самом деле.


Не решал. Там ни раундов, ни боксов в явном виде нет. В то время до этого просто не дошли, а сейчас что-либо делать именно с этим монстром ... Подозреваю, что я просто не понял комментарии, но время переключения на такие задачи у меня очень велико
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: [C++] White-box AES Implementation Generator
От: 0xDEADBEEF Ниоткуда  
Дата: 30.04.08 18:04
Оценка: 1 (1) +1
Здравствуйте, gear nuke, Вы писали:

GN>White-Box Cryptography — относительно новое направление (основные применения — DRM и watermarking) в сети публикаций не так много, а готовые реализации, вероятно, можно вообще не найти. Данный генератор представляет скорее академический, чем практический интерес. Это не пример, как надо делать, а на тему "что это вообще такое". Исследования стойкости не проводились. Написан в 2004 году и сейчас является Public Domain (*).


GN>http://files.rsdn.ru/45067/aesig.zip


GN>

GN>[q]

О программе.

GN>AESIG создаёт программные реализации алгоритма дешифрования AES, предназначенные для работы в условиях "White-Box".
Посмотрел, что этот бинарник генерит.
Вот выводы.
1) AESIG генерит ОГРОМНЫЙ бинарник — 1 мег. Мне кажется, что это неприемлемо.

2) В дизасембле (компиляция с -Fa или -S) структура раундовых функций rXXX() выглядит тривиально — доступна для автоматического реверсинга. Код выглядит примерно так:
op    reg1, literal
jnz   no_way
op    reg2, literal2
no_way:


3) Быстро проглядел сами исходники AESIG — мне кажется, если не компакный ключ, так развернутый ключ дешифрования извлечь оттуда можно. Но пока не уверен.

4) А если неможно, то декриптор все одно можно — просто скопипастив этот заобфускаченный мегабайт в отдельный бинарник.

ЗЫ. Имхо, написать генератор декрипторов RSA который использует ембеднутный в коде ключ было бы более благодарной задачей.
__________
16.There is no cause so right that one cannot find a fool following it.
Re[2]: [C++] White-box AES Implementation Generator
От: gear nuke  
Дата: 01.05.08 03:18
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>1) AESIG генерит ОГРОМНЫЙ бинарник — 1 мег. Мне кажется, что это неприемлемо.


Основная проблема даже не это — далеко не каждый компилятор способен нормально его построить, когда писалось, не было вообще (GCC4 не считали, т.к тогда была альфа) в память о чем осталось
//    printout("static inline unsigned char r%03x(const unsigned char i) \n", name);
    printout("static unsigned char r%03x(const unsigned char i) \n", name);

И, кстати, скорость тоже оставляет желать лучшего.

DEA>2) В дизасембле (компиляция с -Fa или -S) структура раундовых функций rXXX() выглядит тривиально — доступна для автоматического реверсинга. Код выглядит примерно так:

DEA>
DEA>op    reg1, literal
DEA>jnz   no_way
DEA>op    reg2, literal2
DEA>no_way:
DEA>

При inline подстановке местами было лучше. Кстати GCC использовал CMOV. Да, декомпиляция этого довольно проста, поэтому лучше что бы дешифратор представлял некоторую виртмашину. И есть один нюанс — декомпилировать будут только в 2х случаях: солидная цена лицензии, или массовое применение.

DEA>3) Быстро проглядел сами исходники AESIG — мне кажется, если не компакный ключ, так развернутый ключ дешифрования извлечь оттуда можно. Но пока не уверен.


Однозначно можно, как и в любом стойком криптоалгаритме. Вопрос сложности, насколько это будет быстрее, чем брутфорс. Но у меня есть подозрение, что это реально для любых реализаций Поэтому публикаций почти нет: одно дело, если сломают моё, а другое — какого-нибудь именитого спеца.

DEA>4) А если неможно, то декриптор все одно можно — просто скопипастив этот заобфускаченный мегабайт в отдельный бинарник.


В таком виде — да. Есть направление куда копать — 2 последних раунда перемешаны, то есть использование расшифрованных данных предполагается внутри декриптора.

DEA>ЗЫ. Имхо, написать генератор декрипторов RSA который использует ембеднутный в коде ключ было бы более благодарной задачей.


Для ассиметрики обычно не имеет смысла прятать публичный ключ. Хотя, для защиты от кражи приватного ключа — lunch-time атак, взлома серверов может быть полезно. Из симметрики, на мой взгляд, наибольший потенциал имеет enrupt, в силу своей просты и универсальности.

Но дело не в этом — раз появились мысли о более благородных задачах, значит мой пост выполнил свою цель
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.