|
Я написал загрузчик, Немного похвастаюсь |
|
|
|
Mar 7 2006, 20:29
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(Firer @ Mar 7 2006, 21:39)  ... Ко всему прочему добавим избыточность со случайными числами для повышения криптозащиты. Раз уж речь пошла про интим с нескромными вопросами  , я тоже хочу задать такой же нескромный вопрос: Чем написанный загрузчик функционально отличается от двух давно существующих Application Notes от Atmel, реализующих всё в точности то же самое, включая случайные nonsense records, за исключением того, что в них используется DES, 3DES и AES, а не гостовский алгоритм? Всё остальное в точности идентично, включая объем. PS. Вопрос не случаен, так как я тоже написал загрузчик той же функциональности, но использующий USB для любой меги, начиная с 32 (критичен размер бут-блока - еле-еле удалось втиснуться в 4 килобайта, драйверов PC не надо - это HID устройство). Правда, я его еще и расширил функционально в некотором смысле, введя дополнительные возможности, отсутствующие в AppNotes. Может, есть что-то ещё, что можно туда вставить?
|
|
|
|
|
Mar 7 2006, 21:10
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(Firer @ Mar 7 2006, 22:54)  А как ты мегу к USB подключаешь? Через какую микруху? Напрямую через 3 резистора (при трехвольтовом питании), либо через 4 резистора и два стабилитрона (при пятивольтовом). USB реализуется программно, см. эту тему. Вот пример схемы с сайта разработчика драйвера (эта штука работает, как стандартная клавиатура):  Цитата Любопытно. HID - т.е. как накопитель на FLASH-карте для компа? HID - это Human Interface Devices, один из стандартных USB классов. Накопители - это Mass Storage Devices, тоже стандартный класс, но не HID. HID не поддерживает USB bulk transfer type, необходимый для Mass Storage, и не обеспечивает таких скоростей обмена в силу своего предназначения. С точки же зрения удобства написания устройств в формате HID это действительно удобно для низкоскоростного обмена, так как не требуется писать драйвер для PC - работает стандартный от Microsoft (на Win98, 2000 и выше). Также работает под Unix/Linux. Работа из приложений реализуется через стандартный HID API (функции HidD_*), либо просто через CreateFile/ReadFile/WriteFile/Close. И, что особенно приятно, аппаратные затраты минимальны. Код драйвера занимает меньше 2-х килобайт и отлично документирован. Ограничения известны и некритичны. Самое существенное - это кварц на 12 MHz и необходимость запрещать прерывания не более, чем на 20 циклов. Всё обрабатывается в коде прерывания, за исключением пользовательских функций. Цитата(Evgeny_CD @ Mar 7 2006, 22:52)  Цитата(Firer @ Mar 7 2006, 22:39)  Ко всему прочему добавим избыточность со случайными числами для повышения криптозащиты. А сколь "случаен" сей генератор? Чем проверялось? Как правило, на свойствах таких "генераторов" и строят атаки.... В указанном контексте случайные числа - это просто цифровой "шум", вставляемый между значимыми блоками данных для затруднения подбора ключей. Реально важны числа при генерации ключей алгоритма шифрования, а там используется rand() из стандартной библиотеки C. Думаю, что эта функция написана не дилетантами и многократно проверена специалистами по криптографии.
Сообщение отредактировал osnwt - Mar 7 2006, 21:17
|
|
|
|
|
Mar 7 2006, 21:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(osnwt @ Mar 7 2006, 23:10)  Реально важны числа при генерации ключей алгоритма шифрования, а там используется rand() из стандартной библиотеки C. Думаю, что эта функция написана не дилетантами и многократно проверена специалистами по криптографии. :-) Они пишутся максимально просто. В лучшем случае используются достаточно правильные коэффициенты типа Миллера и подобных для получения более-менее приличного периода повторения. Типичный генератор вызлядит так: #define MULTIPLIER 0x015a4e35L #define INCREMENT 1 static long Seed = 1; /*---------------------------------------------------------------------* Name rand - random number generator Usage int rand(void); Related functions usage void srand(unsigned seed); Prototype in stdlib.h Description rand uses a multiplicative congruential random number generator with period 2^32 to return successive pseudo- random numbers in the range from 0 to 2^15 - 1. The generator is reinitialized by calling srand with an argument value of 1. It can be set to a new starting point by calling srand with a given seed number. *---------------------------------------------------------------------*/ int rand(void) { Seed = MULTIPLIER * Seed + INCREMENT; return((int)(Seed >> 16) & 0x7fff); } Впечатляет?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 7 2006, 22:05
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(zltigo @ Mar 7 2006, 23:46)  Впечатляет? Не очень, поскольку эта формула для RAND мне знакома года примерно с 1984, когда я видел ее в дизассемблированном мной интерпретаторе BASIC для МикроЭВМ "Электроника Д3-28" (если кто помнит такую машинку). Правда, там использовалась плавающая арифметика (ибо, была реализована микропрограммно), но сути дела это не меняет. Вопрос правильного подбора коэффициентов, период повторения и количество уникальных значений - это все понятно. Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"? Спорить не буду, так как не специалист по криптографии и не ковырял библиотечные функции. Но замечу, что это - не в "лучшем случае". В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше. Читал интересный рассказ на эту тему. Один товарищ решил реализовать супер-классный алгоритм генерации случайных чисел. Взял несколько разных алгоритмов и завел выход одного на вход другого, и т.п. Каково же было его удивление, когда его алгоритм при первом же запуске зациклился примерно на пятом "случайном" числе
|
|
|
|
|
Mar 7 2006, 23:01
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(Firer @ Mar 8 2006, 00:44)  osnwt: потрясающе красивое решение! Удивительнее то, что работающее, и работающее прилично. Эксперименты с программным USB (как и с программным сетевым адаптером для витой пары) проводились давно. Для AVR USB первым написал Igor Cesko. То был код на ассемблере, не очень удобный для повторения или развития. Но он был первым. Сейчас это - Appnote на сайте Atmel. А Christian Starkjohann написал свой вариант, который, во первых, более оптимален с точки зрения приложения (много чего выполняет непосредственно "на лету" - интересная заметка на эту тему есть на сайте автора). Во вторых, он документирован. Известны его API, особенности и ограничения. Его стало можно использовать в собственных разработках. И, кроме того, с автором исключительно приятно работать. Мы с ним успевали порой по 5-6 пар писем в день (точнее, вечер) обменяться в ходе работ над IAR портом. В результате была выловлена одна особенность, связанная с обработкой процесса установки соединения. Автор доработал его, попутно сократив в объеме (!), но я, бессовестный, уже сутки не могу добраться и проверить на железе работу этого исправления. Всё, бросаю писанину и продолжаю собирать свой очередной макет для проверки кое-каких идей. Тогда и драйвер проверю.
|
|
|
|
|
Mar 8 2006, 05:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(osnwt @ Mar 8 2006, 00:05)  Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"? ... В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше. Алгоритм не стандартизирован никак. Более того, никак не гарантирована его псевдослучайность для повторения. Предыдущий пример взят из реальной жизни - это Borland. Ниже вариант 'послиднее', это IAR. Можете продолжить исследования - на более доступных в исходных текстах библиотеках. Код #define TSIZ 32 /* must be power of two */ #define TMSK (TSIZ - 1) #define XRND(x) (x) * 1664525L + 1013904223L
_TLS_DATA_DEF(_IMPLICIT_EXTERN, char, _Randinit, 0); _TLS_DATA_DEF(_IMPLICIT_EXTERN, unsigned long, _Randseed, 1); _TLS_DATA_DEF(static, unsigned long, idx, 0); _TLS_ARR_DEF(static, unsigned long, rv, TSIZ);
int (rand)(void) { /* compute pseudo-random value */ char *pinit = _TLS_DATA_PTR(_Randinit); unsigned long *pseed = _TLS_DATA_PTR(_Randseed); unsigned long *pidx = _TLS_DATA_PTR(idx); unsigned long *prv = _TLS_ARR(rv); int j;
if (*pinit == 0) { /* warm up, then initialize shuffle table */ for (j = 0; j < 8; ++j) *pseed = XRND(*pseed); for (j = 0; j < TSIZ; ++j) prv[j] = (*pseed = XRND(*pseed)); *pidx = prv[TSIZ - 1]; *pinit = 1; } *pseed = XRND(*pseed); j = *pidx & TMSK; *pidx = prv[j]; prv[j] = *pseed; #if _ILONG return (*pidx & RAND_MAX); #else /* _ILONG */ return ((*pidx >> 16) & RAND_MAX); #endif /* _ILONG */ } Цитата(osnwt @ Mar 8 2006, 00:05)  В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше. Я в курсе. Осталось решить вопрос, как Вы сможете повторить сию последовательность для расшифровки :-))). Ну а 'получше' уже придуманы, только для сишного rand они не используются.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2006, 11:18
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(zltigo @ Mar 8 2006, 07:29)  Цитата(osnwt @ Mar 8 2006, 00:05)  Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"?
Алгоритм не стандартизирован никак. Более того, никак не гарантирована его псевдослучайность для повторения. Предыдущий пример взят из реальной жизни - это Borland. Да я это всё понимаю. Делать аппаратные датчики в ширпотребовских PC никто не станет. Цитата Можете продолжить исследования - на более доступных в исходных текстах библиотеках. Да нет, спасибо  Я же говорил, что не являюсь специалистом по криптографии. Цитата Осталось решить вопрос, как Вы сможете повторить сию последовательность для расшифровки :-))). Ну, это вопрос не ко мне. В текущих аппноутах это используется лишь как шум, а не как средство защиты. Основная защита тут - огромное количество переборов, если исключить выделяющиеся паттерны и т.п. Но вообще-то, такие вещи классически ломаются совсем иначе. Догадываясь, что могло потенциально использоваться для написания такого бута, можно сконцентрировать атаку совсем на другом направлении. Например, на потенциальном переполнении входного буфера, что в исходниках от Atmel представляет вполне очевидную дыру. Правда, получится ли ей воспользоваться - еще вопрос. Но сформировать входной фрейм так, чтобы загрузчик улетел в определенном направлении (на определенный адрес) можно вполне. И какое при этом будет его состояние - неизвестно. Потому я предпочел поправить такие вот места, чем ломать голову над правильностью ключей. Уж мои-то самоделки явно ломать никто не станет - дешевле купить готовое или разработать самому :-) Цитата Ну а 'получше' уже придуманы, только для сишного rand они не используются. Когда-то и 3DES был запрещен, поскольку госагенства не имели ресурсов для его вскрытия. Сейчас с этим проще. Может, и продвинутые алгоритмы и в стандартные библиотеки когда-нибудь попадут.
|
|
|
|
|
Mar 8 2006, 11:41
|
Участник

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956

|
Цитата(osnwt @ Mar 8 2006, 02:01)  А Christian Starkjohann написал свой вариант, который, во первых, более оптимален с точки зрения приложения (много чего выполняет непосредственно "на лету" - интересная заметка на эту тему есть на сайте автора). Во вторых, он документирован. Известны его API, особенности и ограничения. Его стало можно использовать в собственных разработках. И, кроме того, с автором исключительно приятно работать. Мы с ним успевали порой по 5-6 пар писем в день (точнее, вечер) обменяться в ходе работ над IAR портом..... а можно ли выложить порт под IAR?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|