Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм шифрования для AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
_Артём_
Посоветуйте алгоритм шифрования, который можно было бы применить в бутлоадере АВР.
Размер boot-области желательно сделать поменьше - 1 кБ максимум.
follow_me
Цитата(_Артём_ @ Feb 20 2012, 19:39) *
Посоветуйте алгоритм шифрования, который можно было бы применить в бутлоадере АВР.
Размер boot-области желательно сделать поменьше - 1 кБ максимум.


А цель ?

где ключ хранить будете ? в самом бутлодере ? это как сейф хранить с замком
_Артём_
Цитата(follow_me @ Feb 20 2012, 22:12) *
А цель ?

?
Обычная цель - обновлять прошивку в случае выпуска новых версий, при этом исключить возможность копирования софта.

Цитата(follow_me @ Feb 20 2012, 22:12) *
где ключ хранить будете ? в самом бутлодере ? это как сейф хранить с замком

Например в самом бутлодере.
Или во внутренней EEPROM.

Цитата(follow_me @ Feb 20 2012, 22:12) *
это как сейф хранить с замком

?
Непонял, поясните. Я разве что-то странное изобретаю?

follow_me
Цитата(_Артём_ @ Feb 20 2012, 22:21) *
?
Обычная цель - обновлять прошивку в случае выпуска новых версий, при этом исключить возможность копирования софта.


Например в самом бутлодере.
Или во внутренней EEPROM.


?
Непонял, поясните. Я разве что-то странное изобретаю?


сори , с ключем

гляньте тут
_Артём_
Цитата(follow_me @ Feb 20 2012, 22:29) *
сори , с ключем

гляньте тут


Спасибо. Интересная ссылка.

Что-то все алгоритмы здоровые по коду, можно будет сравнить что IAR накомпилирует (думаю - меньше).
Zlumd
Цитата(_Артём_ @ Feb 21 2012, 00:39) *
Посоветуйте алгоритм шифрования, который можно было бы применить в бутлоадере АВР.
Размер boot-области желательно сделать поменьше - 1 кБ максимум.
Посмотри Атмеловские апноты:
AVR231: AES Bootloader on tinyAVR and megaAVR devices и
AVR230: DES Bootloader on tinyAVR and megaAVR devices
Отпишись, нашел ли что-то, чтобы влезть в 1K.

Мы юзаем DES-бутлоадер: Занимает почти 4KБайт. 128 байт расшифровывает за 0.5 сек при частоте 16МГц.
_Артём_
Цитата(Zlumd @ Feb 21 2012, 03:43) *
Посмотри Атмеловские апноты:
AVR231: AES Bootloader on tinyAVR and megaAVR devices и
AVR230: DES Bootloader on tinyAVR and megaAVR devices


Знаю про них, оттого и спрашиваю. Нет столько ресурсов.

Цитата(Zlumd @ Feb 21 2012, 03:43) *
Отпишись, нашел ли что-то, чтобы влезть в 1K.

Добавлю обязательно, если будет что-то новое. Смотрите по ссылке от follow_me.

Цитата(Zlumd @ Feb 21 2012, 03:43) *
чтобы влезть в 1K.

В 1к - это bootloader+передача данных+шифрование?
Или речь только про алгоритм шифрования?

Да, есть. Но... много занимает (в числах могу ошибаться):
~700 байт расшифровать или зашифровать, ключ - 256 бит
~1200 байт расшифровать и зашифровать - много.
Компилятор: IAR.
Оптимизация: максимальная (наверное по размеру).
Алгоритм: один из TEA (чистый Си, вики-copy-past).
Скорость: ?. не впомню сейчас, думаю несколько кБ/с на 11.0592 МГц.

demiurg_spb
ИМХО самый лёгкий во всех смыслах - это RTEA.
ARV
XTEA вроде бы тоже не тяжелый
demiurg_spb
но более уязвимый
e-serg
Цитата(_Артём_ @ Feb 21 2012, 11:34) *
Да, есть. Но... много занимает (в числах могу ошибаться):
~700 байт расшифровать или зашифровать, ключ - 256 бит

весь tea128 на asm(avr8) в 338 байт укладывается.
есть где поэкономить для боотлоадера.
только раскодировать уже 276 байт

Zlumd
Цитата(_Артём_ @ Feb 21 2012, 09:34) *
В 1к - это bootloader+передача данных+шифрование?
Или речь только про алгоритм шифрования?
Конечно, все вместе. Вам же надо, чтобы все вместе влезло в 1К ? Или нет?
Цитата(_Артём_ @ Feb 21 2012, 09:34) *
Всё вместе? Передача-приём-проверка данных?
Процессор - xmegа?
Да. Все вместе. ATmega128.
_Артём_
Цитата(demiurg_spb @ Feb 21 2012, 06:50) *
ИМХО самый лёгкий во всех смыслах - это RTEA.

А как у него с надёжностью?

Цитата(e-serg @ Feb 21 2012, 07:09) *
весь tea128 на asm(avr8) в 338 байт укладывается.
есть где поэкономить для боотлоадера.
только раскодировать уже 276 байт

А есть готовый реализации?

Цитата(Zlumd @ Feb 21 2012, 07:23) *
Конечно, все вместе. Вам же надо, чтобы все вместе влезло в 1К ? Или нет?

Да, нужно чтобы всё в 1кБ.
demiurg_spb
Цитата(_Артём_ @ Feb 21 2012, 14:02) *
А как у него с надёжностью?
Достаточная для задач такого рода.
_Артём_
Цитата(demiurg_spb @ Feb 21 2012, 13:28) *
Достаточная для задач такого рода.

А какой критерий достаточности?


Я хотел узнать с чем по стойкости его можно сопоставить.
kolobok0
Цитата(_Артём_ @ Feb 20 2012, 21:39) *
...применить в бутлоадере АВР....


я немного в другую сторону вам скажу...
а зачем серъёзное шифрование? ведь на вход нельзя подать нечто НЕ ваше. значит методов для изучения - ну очень мало. т.е. если Вы обеспечите каждый раз уникальность передаваемых данных - то понять что вы там нахимичили с декодировкой - утопия. тем более если прошивки будут меняться не каждый понедельник...


надеюсь понятна моя мысль не глубокая? sm.gif (Раневская)

(круглый)
ЗЫ
Помните как в том фильме про "энигму"? Пока не просекли что первым делом посылается координаты цели - т.е. сопоставили ихсодные данные и конечный получаемый шифр, взломать не возможно было. Т.е. если Вы каждый раз будете нечто новое слать - взломать ан реал...
_Артём_
Цитата(kolobok0 @ Feb 21 2012, 13:36) *
а зачем серъёзное шифрование?

Чтобы гарантировано исключить возможность копирования.

Цитата(kolobok0 @ Feb 21 2012, 13:36) *
ведь на вход нельзя подать нечто НЕ ваше. значит методов для изучения - ну очень мало

Мало, да.
Но учитывая малый размер boot-области, моё должно быть понятно и просто, и повторить его несложно.

Цитата(kolobok0 @ Feb 21 2012, 13:36) *
то понять что вы там нахимичили с декодировкой - утопия

Если зашифровать - точно утопия.

Цитата(kolobok0 @ Feb 21 2012, 13:36) *
надеюсь понятна моя мысль не глубокая? sm.gif (Раневская)
(круглый)

Идеи нам близки
kolobok0
Цитата(_Артём_ @ Feb 21 2012, 15:46) *
Чтобы гарантировано исключить возможность копирования....Но учитывая малый размер boot-области, моё должно быть понятно и просто, и повторить его несложно....


не совсем понятно зачем бут загрузчик можно повторять и должен быть понятен - хз. возможно потом вы его кому то подарите - я не в курсе...но если по теме...
пример...
если Вы возьмёте ваши данные поблочно переставите биты в блоке по алгоритму шахматного коня(к примеру), потом наложите ксор состоящий из 30 байт и запишите сначала все чётные потом нечётные байты.

как вы думаете можно такое понять? при условии что кодировщик вы спрячите под подушкой, и обеспечите передаваемые данные таким образом, чтоб статичные данные было нельзя отловить на уровне логики???


(круглый)
ЗЫ
Я тут подошёл к человечку (ранее работал в известной конторе по данной проблеме - защите-взлому), он подтвердил (с оговорками конечно же sm.gif ), что ан-реал. так что применять супер-пупер алгоритмы - мягко говоря может и не имеет смысла в данных условиях...

ЗЫ ЗЫ
я так же недавно реализовывал то же самое в тех же железных рамках. правда понавороченнее +uart(универсал)+modbus(универсал и моя надстройка над стандартом)+прошивальщик в безотказном варианте работы+контроль работоспособности прошивки+вяские мелочи... на азме в половину не вошёл...к сожалению... но почти...может ышо ужмусь sm.gif)) . кодировщик написан на сях. на выходе каждый раз новый массив байт.
_Артём_
Цитата(kolobok0 @ Feb 21 2012, 14:01) *
не совсем понятно зачем бут загрузчик можно повторять и должен быть понятен - хз. возможно потом вы его кому то подарите - я не в курсе...но если по теме...

Не подарю.
Он должен быть простым, потому что размер boot-области небольшой: сложное не впихнёшь.

Цитата(kolobok0 @ Feb 21 2012, 14:01) *
пример...
если Вы возьмёте ваши данные поблочно переставите биты в блоке по алгоритму шахматного коня(к примеру), потом наложите ксор состоящий из 30 байт и запишите сначала все чётные потом нечётные байты.

Ну это всё придумавать и писать надо. И тоже место какое-то займёт в boot (интересно сколько).


Цитата(kolobok0 @ Feb 21 2012, 14:01) *
как вы думаете можно такое понять?
ЗЫ
Я тут подошёл к человечку (ранее работал в известной конторе по данной проблеме - защите-взлому), он подтвердил (с оговорками конечно же sm.gif ), что ан-реал.

Возможно.

Цитата(kolobok0 @ Feb 21 2012, 14:01) *
так что применять супер-пупер алгоритмы - мягко говоря может и не имеет смысла в данных условиях...

О супер-алгоритмах речь не идёт, нужно простое.
demiurg_spb
Цитата(_Артём_ @ Feb 21 2012, 14:34) *
Я хотел узнать с чем по стойкости его можно сопоставить.
http://defectoscopy.com/results.html
_Артём_
Цитата(Zlumd @ Feb 21 2012, 03:43) *
Мы юзаем DES-бутлоадер: Занимает почти 4KБайт. 128 байт расшифровывает за 0.5 сек при частоте 16МГц.

128 байт или 128 кБ?
Zlumd
Цитата(_Артём_ @ Feb 26 2012, 01:57) *
Цитата(Zlumd @ Feb 21 2012, 08:43) *
Мы юзаем DES-бутлоадер: Занимает почти 4KБайт. 128 байт расшифровывает за 0.5 сек при частоте 16МГц.
128 байт или 128 кБ?
128 байт
На заливку 128 кБайт уходит 20 минут.
_Артём_
Цитата(Zlumd @ Feb 27 2012, 04:49) *
На заливку 128 кБайт уходит 20 минут.


Чот как-то медленно...
Вам так не кажется?
e-serg
Цитата(_Артём_ @ Feb 21 2012, 20:02) *
А есть готовый реализации?

CODE

;*******************************************************************************
***
;*******************************************************************************
***
; код TEA128Y
; меняються регистры r4, ..., r25
;*******************************************************************************
***
#ifndef TEA128_INC_
#define TEA128_INC_
.DSEG
d_TEA128_DATA: .BYTE 16
d_TEA128_KEY: .BYTE 16
;*******************************************************************************
***
.CSEG
.def d0=r4
.def d1=r5
.def d2=r6
.def d3=r7

.def c0=r8
.def c1=r9
.def c2=r10
.def c3=r11

.def b0=r12
.def b1=r13
.def b2=r14
.def b3=r15

.def Tea_cnta=r16
.def Tea_cntb=r17

.def s0=r18
.def s1=r19
.def s2=r20
.def s3=r21

.def a0=r22
.def a1=r23
.def a2=r24
.def a3=r25

;*******************************************************************************
***
;Обмен с памятью, загрузка костант
.MACRO MLDI32 ;r3,r2,r1,r0, lab data
ldi @0, @4
ldi @1, @5
ldi @2, @6
ldi @3, @7
.ENDMACRO
.MACRO MLDD32 ;r3,r2,r1,r0, lab data
ldd @3, Y+@4+0
ldd @2, Y+@4+1
ldd @1, Y+@4+2
ldd @0, Y+@4+3
.ENDMACRO
.MACRO MLDS32 ;r3,r2,r1,r0, lab data
lds @3, @4+0
lds @2, @4+1
lds @1, @4+2
lds @0, @4+3
.ENDMACRO
.MACRO MSTD32 ;r3,r2,r1,r0, lab data
std Y+@4+3, @0
std Y+@4+2, @1
std Y+@4+1, @2
std Y+@4+0, @3
.ENDMACRO
.MACRO MSTS32 ;r3,r2,r1,r0, lab data
sts @4+3, @0
sts @4+2, @1
sts @4+1, @2
sts @4+0, @3
.ENDMACRO
.MACRO MSUBI32 ;r3,r2,r1,r0, data
subi @3, @7
sbci @2, @6
sbci @1, @5
sbci @0, @4
.ENDMACRO
.MACRO MCLR32 ;r3,r2,r1,r0
clr @0
clr @1
clr @2
clr @3
.ENDMACRO
.MACRO MADD32
add @3, @7
adc @2, @6
adc @1, @5
adc @0, @4
.ENDMACRO
.MACRO MSUB32
sub @3, @7
sbc @2, @6
sbc @1, @5
sbc @0, @4
.ENDMACRO
.MACRO MLSL32
lsl @3
rol @2
rol @1
rol @0
.ENDMACRO
.MACRO MLSR32
lsr @0
ror @1
ror @2
ror @3
.ENDMACRO
.MACRO MEOR32
eor @3, @7
eor @2, @6
eor @1, @5
eor @0, @4
.ENDMACRO
.MACRO FMEMCPY
ldi ZL, low(@1 << 1)
ldi ZH, high(@1 << 1)
ldi XL, low(@0)
ldi XH, high(@0)
ldi r16, @2
call STX_LPM_LOOP
.ENDMACRO
;*******************************************************************************
***
;*******************************************************************************
***
; кодирование
;*******************************************************************************
***
;*******************************************************************************
***
Tea128_enc:
; lds YL, d_TEA128_DATA_L
; lds YH, d_TEA128_DATA_H
ldi Tea_cnta,32
MCLR32 s3, s2, s1, s0 ;sum
Tea128_enc_while:
MSUBI32 s3, s2, s1, s0, 0x61, 0xc8, 0x86, 0x47 ; sum += delta
;*******************************************************************************
***
rcall lfunc_y
MADD32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Сохранил y
;*******************************************************************************
***
rcall lfunc_z
MADD32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Сохранил z
;*******************************************************************************
***
dec Tea_cnta
breq Tea128_enc_end
rjmp Tea128_enc_while
Tea128_enc_end:
ret
;*******************************************************************************
***
;*******************************************************************************
***
; декодирование
;*******************************************************************************
***
Tea128_dec:
; lds YL, d_TEA128_DATA_L
; lds YH, d_TEA128_DATA_H
ldi Tea_cnta,32
MLDI32 s3, s2, s1, s0, 0xC6, 0xEF, 0x37, 0x20 ;sum
Tea128_dec_while:
;*******************************************************************************
***
rcall lfunc_z
MSUB32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Сохранил z
;*******************************************************************************
***
rcall lfunc_y
MSUB32 a3, a2, a1, a0, d3, d2, d1, d0
MSTD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Сохранил y
;*******************************************************************************
***
MSUBI32 s3, s2, s1, s0, 0x9E, 0x37, 0x79, 0xB9 ; sum -= delta
dec Tea_cnta
breq Tea128_dec_end
rjmp Tea128_dec_while
Tea128_dec_end:
ret
;*******************************************************************************
***
lfunc:
movw d0,a0
movw d2,a2
ldi Tea_cntb,4
lshift4:
MLSL32 d3, d2, d1, d0
dec Tea_cntb
brne lshift4
MADD32 d3, d2, d1, d0, b3, b2, b1, b0
;воспользуюсь b0...3
movw b0,a0
movw b2,a2
ldi Tea_cntb,5
rshift5:
MLSR32 b3, b2, b1, b0
dec Tea_cntb
brne rshift5
MADD32 b3, b2, b1, b0, c3, c2, c1, c0
MEOR32 d3, d2, d1, d0, b3, b2, b1, b0
MADD32 a3, a2, a1, a0, s3, s2, s1, s0
MEOR32 d3, d2, d1, d0, a3, a2, a1, a0
ret
;*******************************************************************************
***
lfunc_y:
MLDD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Загрузил z
MLDS32 b3, b2, b1, b0, d_TEA128_KEY+0 ; Загрузил k[0]
MLDS32 c3, c2, c1, c0, d_TEA128_KEY+4 ; Загрузил k[1]
rcall lfunc ; результата d0...3
MLDD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Загрузил y
ret
;*******************************************************************************
***
lfunc_z:
MLDD32 a3, a2, a1, a0, 0;d_TEA128_DATA+0 ; Загрузил y
MLDS32 b3, b2, b1, b0, d_TEA128_KEY+8 ; Загрузил k[2]
MLDS32 c3, c2, c1, c0, d_TEA128_KEY+12 ; Загрузил k[3]
rcall lfunc ; результата d0...3
MLDD32 a3, a2, a1, a0, 4;d_TEA128_DATA+4 ; Загрузил z
ret
;*******************************************************************************
***
d_TEA128_KEY_DB: .db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
TEA128_KEY_INIT:
; ldi YL, low(d_TEA128_DATA)
; ldi YH, high(d_TEA128_DATA)
; sts d_TEA128_DATA_L, YL
; sts d_TEA128_DATA_H, YH
FMEMCPY d_TEA128_KEY, d_TEA128_KEY_DB, 16
ret
#endif /* TEA128_INC_ */

вот математика на asm, давно делал sm.gif
RTEA может выйти и покороче.
_Артём_
Цитата(e-serg @ Feb 27 2012, 14:26) *
вот математика на asm, давно делал sm.gif
RTEA может выйти и покороче.


Это
Цитата
только раскодировать уже 276 байт

?
Ассемблер IAR или чей?
Zlumd
Цитата(_Артём_ @ Feb 27 2012, 19:04) *
Чот как-то медленно...
Вам так не кажется?
Конечно медленно. В DES много битовых перестановок. Быстрее не получается сделать.
e-serg
Цитата(_Артём_ @ Feb 27 2012, 21:49) *
Ассемблер IAR или чей?

AvrStudio ASM
_Артём_
Цитата(Zlumd @ Feb 28 2012, 05:05) *
Конечно медленно. В DES много битовых перестановок.

Много, не отрицаю.

Цитата(Zlumd @ Feb 28 2012, 05:05) *
Быстрее не получается сделать.


Из appnote Atmel для 16kB:
Цитата
DES, 115200 Bauds, 16 MHz Target Frequency: 20 Seconds


Цитата
На заливку 128 кБайт уходит 20 минут.

Минут трёх должно хватать. Если Atmel нам не врёт.

Цитата(e-serg @ Feb 28 2012, 13:49) *
AvrStudio ASM

Ясно.

На Си не пробовали? Размер намного больше получается?
DrGluck
1. "Размер boot-области желательно сделать поменьше - 1 кБ максимум" ... делаю вывод, что ориентируемся на младшие модели ...
2. Если модели "младшие", что можно на них сотворить "такое" - "неповторяемое" в принципе ?
3. Если оно в принципе "повторяемое" - то к чему стремление к Супер защите ?

P.S. "В рассуждениях О ... " солидарен с "kolobok0"

P.P.S.
Цитата
На заливку 128 кБайт уходит 20 минут
- физиономию пользователя в студию !
_Артём_
Цитата(DrGluck @ Feb 28 2012, 18:50) *
1. "Размер boot-области желательно сделать поменьше - 1 кБ максимум" ... делаю вывод, что ориентируемся на младшие модели ...

Верно.

Цитата(DrGluck @ Feb 28 2012, 18:50) *
2. Если модели "младшие", что можно на них сотворить "такое" - "неповторяемое" в принципе ?
3. Если оно в принципе "повторяемое" - то к чему стремление к Супер защите ?

А что вообще можно "неповторяемое" сделать?
Всё повторяемое и в принципе и в кожухе.
Всё повторить можно, но это не повод от защиты отказываться.

Цитата(DrGluck @ Feb 28 2012, 18:50) *
Супер защите ?

Что там "Супер"? Обычное шифрование.

Цитата(DrGluck @ Feb 28 2012, 18:50) *
P.P.S. - физиономию пользователя в студию !

Ногами всёж не бейте его.
DrGluck
Цитата
но это не повод от защиты отказываться ...

Random-массив для XOR-операций (идентичный в bootloader и в утилите формирования файла обновления) по остаточному принципу + для "спокойствия души" параметризированные команды по USART , т.е. дополнительная примитивная бит/байт математика для каждого пакета протокола обмена. Навскидку - слом линейной адресной загрузки в CODE-flash.

P.S. Я лично дополнительно использую bootloader для размещения там драйвера протокола по USART. Если девайс подразумевает связь с "внешним миром" - зачем делать одно и тоже по сути дважды и занимать дополнительное место ?
Zlumd
Цитата(_Артём_ @ Feb 28 2012, 19:24) *
Минут трёх должно хватать. Если Atmel нам не врёт.
Может там DES 56 bit имеется ввиду? У нас TripleDES 168 bit. Плюс неоптимально написанная программа загрузчика для компа.
_Артём_
Цитата(Zlumd @ Feb 29 2012, 03:27) *
Может там DES 56 bit имеется ввиду? У нас TripleDES 168 bit. Плюс неоптимально написанная программа загрузчика для компа.

Да. 20 секунд - просто DES.
3DES - 16 кБ, 50 секунд на 16 МГц.
128кБ будет < 7 минут.
kolobok0
Цитата(DrGluck @ Feb 28 2012, 21:11) *
...P.S. Я лично дополнительно...


+1

такой же подход.

(круглый)
dvm11111111
Посмотрите на алгоритмы RC5(именно алгоритм шифрования а не код с пульта ) и RC6 или подобные, они под 8 битные контроллеры заточены. Места не много занимают, правда криптозащищенность похуже чем у 3DES/
IGK
Случайно увидел тему...
Я пользую простейшую кодировку: в таблице 256 байт хранятся коды, перекодирующие байты программы (ассемблерные команды). Для кодировки использую простое приложение, генерирующее файлы кодировки из bin файла, написанное на VB. Коды генерятся с rnd, конечно, вначале пустые циклы, связанные с датой. Для вящей надежности использую смещение блоков :-) Уместилось в 1К. Есть нюанс - не влез CRC, однако по COM-порту на скорости 9600 сбои настолько редкие, что еще ни один пользователь не сообщил об ошибках. Загрузка через простой терминал. Работы было на три дня...
Сложность кодировки зависит от цены изделия. Для 400$ я посчитал такую криптографию достаточной.
Petka
Странно, что никто не упомянул шифрование по ГОСТ 28147-89
Алгоритм разработан с учётом минимальных требований к ресурсам. Криптостойкость на уровне 3DES. На данный момент при использовании проверенных таблиц перестановок уязвимостей в алгоритме не найдено. Где-то ранее в этом форуме я приводил сравнение по размеру требуемой flash памяти в avr алгоритмов ГОСТ и XTEA. ГОСТ требовал меньше flash памяти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.