реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Я написал загрузчик, Немного похвастаюсь
Firer
сообщение Mar 7 2006, 18:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Для AVR, с шифрованием по ГОСТ28147-89,
помещается в блок 2kWord, грузит файл из UART.
+ утилитка под Windows для преобразования .hex файлов FLASH и EEPROM в шифрованный файл, и утилитка для пользователя для загрузки в кристалл.
Целый год мечтал сделать.
Go to the top of the page
 
+Quote Post
makc
сообщение Mar 7 2006, 19:23
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



А теперь можно нескромный вопрос - где ключики держатся? wink.gif


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Firer
сообщение Mar 7 2006, 19:39
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Ключи шифрования задаются в программе для подготовки файла. Она пользователям не распространяется.
И в программе самого загрузчика. А эта программа прошивается производителем, с битами защиты.
В программе для ПК для обновления прошивки которую юзает юзер никаких манипуляций с шифрованием нет.
Ко всему прочему добавим избыточность со случайными числами для повышения криптозащиты.
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 20:29
Сообщение #4


Частый гость
**

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



Цитата(Firer @ Mar 7 2006, 21:39) *
...
Ко всему прочему добавим избыточность со случайными числами для повышения криптозащиты.

Раз уж речь пошла про интим с нескромными вопросами smile.gif, я тоже хочу задать такой же нескромный вопрос:

Чем написанный загрузчик функционально отличается от двух давно существующих Application Notes от Atmel, реализующих всё в точности то же самое, включая случайные nonsense records, за исключением того, что в них используется DES, 3DES и AES, а не гостовский алгоритм? Всё остальное в точности идентично, включая объем.

PS. Вопрос не случаен, так как я тоже написал загрузчик той же функциональности, но использующий USB для любой меги, начиная с 32 (критичен размер бут-блока - еле-еле удалось втиснуться в 4 килобайта, драйверов PC не надо - это HID устройство). Правда, я его еще и расширил функционально в некотором смысле, введя дополнительные возможности, отсутствующие в AppNotes. Может, есть что-то ещё, что можно туда вставить?
Go to the top of the page
 
+Quote Post
Evgeny_CD
сообщение Mar 7 2006, 20:52
Сообщение #5


Гуру
******

Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892



Цитата(Firer @ Mar 7 2006, 22:39) *
Ко всему прочему добавим избыточность со случайными числами для повышения криптозащиты.
А сколь "случаен" сей генератор? Чем проверялось? Как правило, на свойствах таких "генераторов" и строят атаки....
Go to the top of the page
 
+Quote Post
Firer
сообщение Mar 7 2006, 20:54
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



osnwt: ничем, только другой алгоритм шифрования и Codevision вместо IAR.
А как ты мегу к USB подключаешь? Через какую микруху? Любопытно. HID - т.е. как накопитель на FLASH-карте для компа?
Go to the top of the page
 
+Quote Post
Firer
сообщение Mar 7 2006, 21:05
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Evgeny_CD: Данный вопрос не беспокоит, мы не радары военные создаем
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 21:10
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 7 2006, 21:46
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 22:05
Сообщение #10


Частый гость
**

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



Цитата(zltigo @ Mar 7 2006, 23:46) *
Впечатляет?

Не очень, поскольку эта формула для RAND мне знакома года примерно с 1984, когда я видел ее в дизассемблированном мной интерпретаторе BASIC для МикроЭВМ "Электроника Д3-28" (если кто помнит такую машинку). Правда, там использовалась плавающая арифметика (ибо, была реализована микропрограммно), но сути дела это не меняет.

Вопрос правильного подбора коэффициентов, период повторения и количество уникальных значений - это все понятно. Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"?

Спорить не буду, так как не специалист по криптографии и не ковырял библиотечные функции. Но замечу, что это - не в "лучшем случае". В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше.

Читал интересный рассказ на эту тему. Один товарищ решил реализовать супер-классный алгоритм генерации случайных чисел. Взял несколько разных алгоритмов и завел выход одного на вход другого, и т.п. Каково же было его удивление, когда его алгоритм при первом же запуске зациклился примерно на пятом "случайном" числе smile.gif
Go to the top of the page
 
+Quote Post
Firer
сообщение Mar 7 2006, 22:44
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



osnwt: потрясающе красивое решение!
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 23:01
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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 портом. В результате была выловлена одна особенность, связанная с обработкой процесса установки соединения. Автор доработал его, попутно сократив в объеме (!), но я, бессовестный, уже сутки не могу добраться и проверить на железе работу этого исправления.

Всё, бросаю писанину и продолжаю собирать свой очередной макет для проверки кое-каких идей. Тогда и драйвер проверю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2006, 05:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 8 2006, 11:18
Сообщение #14


Частый гость
**

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



Цитата(zltigo @ Mar 8 2006, 07:29) *
Цитата(osnwt @ Mar 8 2006, 00:05) *

Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"?


Алгоритм не стандартизирован никак. Более того, никак не гарантирована его псевдослучайность
для повторения. Предыдущий пример взят из реальной жизни - это Borland.

Да я это всё понимаю. Делать аппаратные датчики в ширпотребовских PC никто не станет.

Цитата
Можете продолжить исследования - на более доступных в исходных текстах библиотеках.

Да нет, спасибо smile.gif Я же говорил, что не являюсь специалистом по криптографии.

Цитата
Осталось решить вопрос, как Вы сможете повторить сию последовательность для
расшифровки :-))).

Ну, это вопрос не ко мне. В текущих аппноутах это используется лишь как шум, а не как средство защиты. Основная защита тут - огромное количество переборов, если исключить выделяющиеся паттерны и т.п.

Но вообще-то, такие вещи классически ломаются совсем иначе. Догадываясь, что могло потенциально использоваться для написания такого бута, можно сконцентрировать атаку совсем на другом направлении. Например, на потенциальном переполнении входного буфера, что в исходниках от Atmel представляет вполне очевидную дыру. Правда, получится ли ей воспользоваться - еще вопрос. Но сформировать входной фрейм так, чтобы загрузчик улетел в определенном направлении (на определенный адрес) можно вполне. И какое при этом будет его состояние - неизвестно. Потому я предпочел поправить такие вот места, чем ломать голову над правильностью ключей. Уж мои-то самоделки явно ломать никто не станет - дешевле купить готовое или разработать самому :-)

Цитата
Ну а 'получше' уже придуманы, только для сишного rand они не используются.

Когда-то и 3DES был запрещен, поскольку госагенства не имели ресурсов для его вскрытия. Сейчас с этим проще. Может, и продвинутые алгоритмы и в стандартные библиотеки когда-нибудь попадут.
Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 8 2006, 11:41
Сообщение #15


Участник
*

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



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


а можно ли выложить порт под IAR?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 19:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016