Мазмұны:

Arduino көмегімен қауіпсіздік: Atecc608a: 7 қадам
Arduino көмегімен қауіпсіздік: Atecc608a: 7 қадам

Бейне: Arduino көмегімен қауіпсіздік: Atecc608a: 7 қадам

Бейне: Arduino көмегімен қауіпсіздік: Atecc608a: 7 қадам
Бейне: Ардуино Уно жиынтығының көмегімен "Бағдаршам Жасау " 2024, Шілде
Anonim
Arduino көмегімен қауіпсіздік: Atecc608a
Arduino көмегімен қауіпсіздік: Atecc608a
Arduino көмегімен қауіпсіздік: Atecc608a
Arduino көмегімен қауіпсіздік: Atecc608a

Тақырып

Барлығына сәлем !

Бұл менің нұсқаулыққа арналған бірінші мақалам, сондықтан сіздердің барлығыңызға қызықты болады деп сенемін.

Бұл мақалада мен сізге бірнеше қауіпсіздік құралдарын беретін «ATECC608A» деп аталатын микро чипті қалай пайдалану керектігін түсіндіремін.

Бұл чипті MicroChip жасаған және ол «CryptoAuthentication чипінің» соңғы нұсқасы. Бұл нұсқаға дейін «ATSHA204A» және «ATECC508A» болды.

Неліктен мен алдыңғы нұсқаны емес, соңғы нұсқаны қолдануды шештім?

Бұл нұсқа ең жетілдірілген чип болып табылады және ескі нұсқада жоқ функциялары бар (мысалы: AES модулі, IO қорғау модулі …).

Неліктен бұл жоба?

Мен CyberSecurity доменінде жұмыс жасаймын және мен бағдарламалау мен электрониканы жақсы көретінмін. Оқу кезінде мен IoT қауіпсіздігі бойынша маманмен конференция өткіземін, ол бізге өнеркәсіптің IoT объектісінде қауіпсіздікті пайдаланбайтынын көрсетті. Мен смартфонмен Bluetooth арқылы ашылатын құлыпты көрсеттім. Құлыпта «Бұл құлып кілтті құлыптан гөрі қауіпсіз!» Деп жазылған. Бұл сөйлем оны күлдіріп жіберді және ол «Бұл құлып - бұл бұрын жасалған ең нашар құлып!» Деген сөйлемді өзгертті.

Ол бізге өзінің дербес компьютерімен және Bluetooth сниферімен смартфон жіберген әрбір команда бірдей болатынын көрсетті және бұл пәрменді көшіру және оны смартфонмен жіберу өте қарапайым. Ол бізге «Өндірістік» үшін «қауіпсіздік» басты мәселе емес екенін түсіндірді. Ол бізге осы объектілерге қауіпсіздік қабатын қоса алатын чиптерді (0,60 доллардан төмен) көрсетті.

Осы демонстрациядан кейін мен IoT объектісіне қауіпсіздік қабатын қосатын ашық бастапқы жобаны табуға тырыстым, бірақ мен оны ешқашан таппадым.

Сондықтан мен екі IoT объектісі арасындағы байланыс үшін қауіпсіздік қабатын қолданатын жобада жұмыс істеуді шештім.

Менің ойым қандай?

Екі IoT объектісі арасындағы байланыс кезінде бірнеше шабуылдар болуы мүмкін: қарапайым адам, ақпарат көшірмесі және тағы басқалар.. Сондықтан менің ойым өте қарапайым:

  1. Екі немесе одан да көп IoT объектілері арасында шифрланған деректерді қолдану.
  2. Бағасы төмен жабдықтар
  3. Arduino UNO -мен жұмыс жасай алады

Енді мен сізге бұл дерексіз суретті Arduino мен Atecc608a чипімен қалай жүзеге асырғанымды түсіндіремін. Бұл мақалада мен сізге Arduino UNO -ны ATECC608A көмегімен қалай қолдану керектігін түсіндіремін.

Мен келесі жолы екі объектінің байланысы туралы мақала жазамын.

Жабдықтар

Бұл жоба үшін сізге бірнеше нәрсе қажет:

  1. Arduino UNO немесе MEGA (чип Atmega 328 немесе ATMEGA 2560 болуы керек)
  2. Atecc608A чипі (әрқайсысының бағасы 0,80 доллардан төмен, жеткізушінің веб -сайтында табу оңай)
  3. 8 істікшелі SOIC адаптері
  4. Кейбір сымдар мен резисторлар

Бұл чиптің алдыңғы нұсқасының (Atecc508a) деректер кестесі мына жерден қол жетімді -> Atecc508a деректер кестесі

1 -қадам: Қадам бойынша

Бірте-бірте
Бірте-бірте

Бұл мақалада мен сізге осы чиптің конфигурациясын қалай өзгерту керектігін және AES CBC алгоритмінің көмегімен деректерді шифрлауды көрсетемін.

Біз келесі қадамдарды орындаймыз:

  1. Тізбектің дизайны
  2. Бұл чиптің конфигурациясы
  3. AES CBC модулін қолдану
  4. Бұл чипті не үшін пайдалану керек?

Әр қадам үшін мен сіз үшін бәрін егжей -тегжейлі айтып беремін. Сондай -ақ, мен Github -да кодты әр функцияға түсініктемелермен қостым. Егер менің кодыма немесе осы жобаға қатысты сұрақтарыңыз болса, мен жауап беруге қуаныштымын.

Менің Github: Менің Github

2 -қадам: Atecc608a туралы ескерту

Atecc608a туралы ескерту
Atecc608a туралы ескерту

Atecc608a чипі «оңай» чип емес.

Біріншіден, бұл чиптің құжаттары NDA астында, сондықтан оны Интернетте толық таба алмайсыз. Бірақ бұл үшін ешқандай қиындық жоқ, алдыңғы нұсқаның деректер кестесі ATECC508A толық деректер кестесінде бар.

Екіншіден, сіз бұл чипті қолданған кезде оның конфигурациясын құлыптауыңыз қажет және егер ол құлыптаулы болса, чиптің конфигурациясын өзгерту мүмкін емес. Сондықтан конфигурация аймағы мен деректер аймағын құлыптау кезінде абай болыңыз.

Үшіншіден, С тілінде жазылған кітапхана өте үлкен және толық, сондықтан сіз бұрын қолданатын функциялардың құжаттамасын оқуыңыз керек.

Төртіншіден, кітапхана бұл чип үшін Arduino UNO -да жұмыс істемейтінін жазды, бірақ ол Arduino UNO -мен жұмыс істеу үшін қажет функцияларды қосты.

ATECC608A чипі

Сіз бұл чиппен I2C арқылы байланыса аласыз. Бұл чиптің мекенжайын конфигурацияда өзгертуге болады.

Бұл чипте әр түрлі деректерді қамти алатын 16 түрлі слот бар:

  1. ECC кілті (жеке немесе ашық)
  2. AES кілті
  3. Басқа деректер (мысалы, Ша хэш немесе жай сөздер)

Біздің жағдайда біз AES кілтін бір ұяшықта сақтаймыз.

3 -қадам: 1. Схеманың дизайны

1. Схеманың дизайны
1. Схеманың дизайны
1. Схеманың дизайны
1. Схеманың дизайны

1. Тізбектің конструкциясы

Бұл схеманың схемасы өте қарапайым!

Сізге 3,3 В қуатын пайдалану керек, себебі ұсыныс 2,0 В пен 5,5 В аралығында, бірақ мен 3,3 В кернеуді қолданғанды жөн көрдім.

Бұл чип үшін әдетте микросхеманың бұрышында нүкте болады, бұл нүкте осы тақтаның 1 -штыры. Мен PIN нөмірі бар Atecc608a-ның жоғарғы көрінісін қостым, себебі бұл 8 сымды SOIC, сондықтан чип өте кішкентай.

  1. ARDUINO 3.3V -> PIN 8 (Atecc608a)
  2. ARDUINO GND -> PIN 4 (Atecc608a)
  3. ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  4. ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Сізге 3,3 В қуатын пайдалану керек, себебі ұсыныс 2,0 В пен 5,5 В аралығында, бірақ мен 3,3 В кернеуді қолданғанды жөн көрдім.

Мен Atecc608a-ның жоғарғы көрінісін қостым, себебі ол 8 сымды SOIC, сондықтан чип өте кішкентай. Егер сіз қаласаңыз, жеткізушілер чипті дәнекерлейтін тақтаны жасайды, бұл сізге оңай болуы мүмкін.

Ескерту: Менің жағдайда, мен Arduino мен чиптің SDA арасына резистор қосуым керек (сонымен қатар SDL үшін). Мен әрқайсысына 4,7 кОм резистор қостым.

4 -қадам: 2. Чиптің конфигурациясы (Atecc608a)

Шифрлау немесе дешифрлеу функциясын қолданар алдында чипті конфигурациялау қажет. Бұл қадамда мен осы чиптің конфигурациясы үшін қажет барлық қадамдарды егжей -тегжейлі айтып беремін.

Ескерту: бұл қадам өте маңызды және егер сіз аймақтарды соңына дейін құлыптасаңыз, оларды өзгерте алмайсыз.

Бұрын айтылғандай, бұл чип екі аймақтан тұрады:

  1. Конфигурация аймағы
  2. Деректер аймағы

Конфигурация аймағының көлемі 128 байт болды, бірақ алғашқы 16 байтты өзгерту мүмкін емес.

Бұл чипті конфигурациялау үшін сізге екі қадам қажет. Әр қадамды ретімен орындау өте маңызды, әйтпесе сіздің конфигурацияңыз жұмыс істемейді, ал сіздің чип бекітіліп, жарамсыз болады. Бұл қадамдар:

  1. Конфигурация үлгісін жасаңыз
  2. Бұл үлгіні чипке жазыңыз
  3. Конфигурация аймағын құлыптаңыз
  4. AES кілтін (128 бит) ұяшыққа жазыңыз
  5. Деректер аймағын құлыптаңыз

ақпарат

Төменде мен кодымен конфигурацияның әр қадамын егжей -тегжейлі сипаттаймын, бірақ алаңдамаймын, мен Github -да конфигурацияның толық мысалын қостым. Мен әр функцияға түсініктеме беремін, және *.ino файлы сіз үшін әр қадамда қол жетімді.

  • Менің Github: Менің Github
  • Мысал конфигурациясының жолы: configuration_example.ino

Бірінші қадам: конфигурация үлгісін жасаңыз

Бұрын түсіндірілгендей, конфигурация аймағы 128 биттік өлшемге ие болады, бірақ алғашқы 16 битті өзгерту мүмкін емес. Бұл аймақ бірнеше бөліктен тұрады, бірақ сіз бұл жоба үшін осы конфигурация аймағының тек 3 бөлігін білуіңіз керек:

  1. Bytes 16 -> Бұл чиптің I2C мекенжайы
  2. Байт 20 -дан 51 -ге дейін -осы чиптің 16 ұясына арналған ұяның түрін өзгертуге болады
  3. Байт 96 -127 -> Мұнда әр ұяшықта қолданылатын кілт немесе деректер түрін орнатуға болады.

(Егер сізге осы аймақтың толық түсіндірмесі қажет болса, құжаттаманы оқыңыз (13 бет, 2.2 бөлім))

Мұнда мен чип конфигурациясының 112 байтының әрбір байтын/бөлігін егжей -тегжейлі жаздым. Бұл мысал, әрбір сатып алынған чиптің басқа конфигурациясы болуы мүмкін:

0xC0, // I2C мекенжайы

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config Slot 1 0x85, 0x20, // Slot Config Slot 2 0x8F, 0x20, // Slot Config Slot 3 0xC4, 0x8F, // Slot Config Slot 4 0x8F, 0x8F, // Slot Config Slot 5 0x8F, 0x8F, // Slot Config Slot 6 0x9F, 0x8F, // Slot Config Slot 7 0x0F, 0x0F, // Slot Config Slot 8 0x8F, 0x0F, // Slot Config Slot 9 0x8F, 0x0F, // Slot Config Slot 10 0x8F, 0x0F, // Slot Config Slot 11 0x8F, 0x0F, // Slot Config Slot 12 0x8F, 0x0F, // Slot Config Slot 13 0x00, 0x00, // Slot Config Slot 14 0x00, 0x00, // Slot Config Slot 15 0xAF, 0x8F, // Slot Config Slot 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Key Config Slot 1 0x33, 0x00, // Key Config Slot 2 0x33, 0x00, // Key Config Slot 3 0x1C, 0x00, // Key Config Slot 4 0x1C, 0x00, // Key Config Slot 5 0x 1C, 0x00, // Key Config Slot 6 0x1C, 0x00, // Key Config Slot 7 0x3C, 0x00, // Key Config Slot 8 0x1A, 0x00, // Key Config Slot 9 0x3A, 0x00, // Key Config Slot 10 0x1A, 0x00, // Key Config Slot 11 0x3A, 0x00, // Key Config Slot 12 0x3A, 0x00, // Key Config Slot 13 0x3C, 0x00, // Key Config Slot 14 0x3C, 0x00, // Key Config Slot 15 0x1C, 0x00 // Key Config Slot 16

Көріп отырғаныңыздай, мен бұл конфигурацияны түсіну үшін осы кодқа бірнеше түсініктеме бердім.

Сіздің жағдайда тек үш нәрсені түсіну қажет:

  1. Bytes 16 -> бұл чиптің I2C мекенжайы
  2. Байт 20 -дан 51 -ге дейін -осы чиптің 16 ұясына арналған ұяның түрін өзгертуге болады
  3. Байт 96 -127 -> Мұнда әр ұяда қолданылатын кілт немесе деректер түрін орнатуға болады.

Мен конфигурация түрін түсіндірмеймін және неге мен оны қолдандым, басқасын емес, өйткені бәрін түсіндіру қиын. Егер сізге қосымша ақпарат қажет болса, құжаттамаға өтіңіз, «SlotConfig» үшін 2.2.1 -бөлімнің 16 -беті және «KeyConfig» үшін 19 -беттегі 2.2.5 -бөлім.

Бұл мысал үшін сіз AES кілтін сақтау үшін 9 ұяшығын қолданасыз.

Ол үшін бізге қою керек (қажет болса, жоғарыдағы мысалды көшіруге болады, онда модификация жасалған):

  1. 36 байт = 0x8F
  2. Байт 37 = 0x0F
  3. Байт 112 = 0x1A
  4. 113 байт = 0x00

Неліктен мен бұл конфигурацияны орнаттым: Бұл чиптің әрбір ұясы үшін сіз микросхемаға қандай деректер сақталатынын айтатын параметрлерді орната аласыз. Сізде бірнеше параметрлер бар:

  • Слот жазылуы немесе оқылуы мүмкін (әрекетті өшіру немесе шифрлау)
  • Сақталатын мәліметтер түрі (ECC кілті, ашық кілт, SHA хэш, AES кілті …)
  • Слотты құлыптауға болады
  • Кілтті жасауға рұқсат етілген

36 және 37 байтты «0x0F8F» күйіне орнатқанда:

  • Деректерді Clear бағдарламасында жазуға болады
  • Бұл ұяшықтың мазмұны құпия және оны оқу мүмкін емес
  • CheckMac Copy командасы үшін ұяны пайдалану мүмкін емес

112 және 113 байтты «0x001A» күйіне орнатқанда:

Слот төрт AES 128-ге дейінгі симметриялы кілттерді сақтай алады (KeyType = 0x6)

Екінші қадам: Бұл конфигурацияны жазыңыз

Бұл қадам өте маңызды, өйткені біз конфигурациямен чипті орнатамыз және егер бұл конфигурация жақсы болмаса, сіз бұл чипті қолданасыз.

Бірақ алаңдамаңыз, егер конфигурация құлыпталмаған болса, сіз конфигурацияны өзгерте аласыз.

Мұнда конфигурацияны чипке жазу үшін қолданылатын код:

/** / қысқаша чипке жаңа конфигурация жазыңыз.

* / param [in] cfg Логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h * / param [in] config ішінен табуға болады uint8_t конфигурация массиві (ұзындығы 112) * / param [in] len Конфигурация массивінің өлшемі * / ATCA_SUCCESS табысқа оралады, әйтпесе қате коды. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) ATCA_BAD_PARAM қайтарады; ATCA_STATUS күйі; күй = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Массив конфигурациясын чипке жазыңыз // 16 байтты толтыру (16 бірінші байтты жазу мүмкін емес) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); қайтару мәртебесі; } қайтару күйі; }

Бұл функция чипке сіздің конфигурацияңызды жазады.

Үшінші қадам: конфигурация аймағын құлыптау

Ескерту: бұл қадамға абай болыңыз, егер сіз бұл аймақты құлыптасаңыз және конфигурацияңыз жақсы болмаса, чип жарамсыз және сіз бұл аймақты өзгерте алмадыңыз

Бұл әрекетті орындау үшін біз бұл функцияны қолданамыз:

/** / қысқаша DATA_ZONE немесе CONFIG_ZONE құлыпталғанын тексеріңіз

* / param [in] cfg Логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h * / param [in] LOCK_ZONE_DATA аймағында немесе LOCK_ZONE_CONFIG * / ATCA_SUCCESS табысқа қайтарады, әйтпесе қате коды. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t аймақ) {ATCA_STATUS күйі; bool lock = жалған; егер (аймақ! = (uint8_t) LOCK_ZONE_CONFIG && аймақ! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM қайтару; күй = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS қайтару; } ATCA_BAD_PARAM қайтару; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Төртінші қадам: Сізге AES кілтін ұяға жазыңыз

Бұл бөлімде сіз чиптің конфигурациясында анықталған ұяшыққа жеке AES кілтін орнатасыз.

Бұл мысал үшін мен чиптің 9 ұяшығын қолданамын.

Сіз білуіңіз керек: Бұл чиптің ерекшелігі - сіз ұяға деректерді тек 4 байт немесе 32 байт арқылы жаза аласыз. AES үшін бізге 128 биттік кілт қажет, сондықтан 16 байт деректер. Мен 32 байт деректері болуы үшін осы ұяшықта әрқайсысы 16 байт кілтке жазуды шештім.

Енді мен сізге қолданылатын кодты көрсетемін:

/** / қысқаша берілген ұяшыққа AES кілтін жазыңыз. * / param [in] cfg логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h сайтынан табуға болады. әйтпесе қате коды. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t пернесі, uint8_t *datakey, size_t len) {if (16 перне) ATCA_BAD_PARAM қайтарады; if (len! = 32) ATCA_BAD_PARAM қайтару; ATCA_STATUS күйі = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) кілт, 0, 0, datakey, 32); if (status! = ATCA_SUCCESS) қайтару күйі; } қайтару күйі; }

Бұл мысал үшін мен әрқайсысы 16 байтты екі AES кілтін қолданамын:

// AES KEY мысалы (len 32) uint8_t example_of_key [32] = «ААААААААААААААААААААААААААААААААААА»; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Егер бұл әрекет жақсы болса, енді сіз «деректер аймағын құлыптау» соңғы қадамын өтуіңіз керек.

Соңғы қадам: деректер аймағын құлыптау

Ескерту: бұл қадамға абай болыңыз, егер сіз осы аймақты құлыптасаңыз және сіздің деректеріңіз орнатылмаса, чип жарамсыз және сіз бұл аймақты өзгерте алмадыңыз

Бұл әрекетті орындау үшін біз бұл функцияны қолданамыз:

/** / қысқаша DATA_ZONE немесе CONFIG_ZONE құлыпталғанын тексеріңіз

* / param [in] cfg логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h * / param [in] LOCK_ZONE_DATA аймағында немесе LOCK_ZONE_CONFIG * / ATCA_SUCCESS табысқа қайтарады, әйтпесе қате коды. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t аймақ) {ATCA_STATUS күйі; bool lock = жалған; егер (аймақ! = (uint8_t) LOCK_ZONE_CONFIG && аймақ! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM қайтару; күй = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS қайтару; } ATCA_BAD_PARAM қайтару; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Егер бұл әрекет жақсы болса, сіздің чипіңіз пайдалануға дайын

5 -қадам: 3. AES CBC модулін қолдану

3. AES CBC модулін қолдану
3. AES CBC модулін қолдану

Мен AES CBC алгоритмімен және Atecc608a чипімен деректерді қалай шифрлау мен шифрды ашу керектігін түсіндіремін.

Есіңізде болсын: бұл функцияны қолданар алдында чипті орнату қажет. Ол үшін осы мақаланың 2 -қадамын орындаңыз

Бұл чип AES модулінің бірнеше түрін алды (AES 128 бит), тек AES 128 бит мүмкін:

  1. AES қалыпты
  2. AES CBC
  3. AES GCM (GFM хэшімен) (қосымша түсініктеме алу үшін Уикипедияны қараңыз)

Қолдануды жеңілдету үшін мен екі функция жасадым:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Бұл екі функция менің Github -те қол жетімді.

Түсіндіру

Мен AES CBC алгоритмін қолданамын, себебі ол негізгі AES 128 биттеріне қарағанда қауіпсіз. Бұл алгоритм деректерді шифрлау үшін бастапқы векторды қолданады.

ақпарат

Төменде мен шифрлау мен шифрды ашу әдісінің әр қадамын егжей -тегжейлі сипаттаймын. Бірақ мен Arduino үшін осы екі функцияны қолданатын код жаздым. Сіз бұл кодты Github -да көре аласыз:

  • Github: Менің Github
  • «Шифрлау/шифрын ашу» кодының мысалы: AES_crypto_example.ino

Бірінші қадам: деректерді шифрлау

Бұл бөлімде мен сізге деректерді қалай шифрлау керектігін көрсетемін.

Алдымен сізге бұл функция қажет:

/** / қысқаша AES CBC алгоритмі көмегімен деректерді шифрлау* / param [in] cfg Логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h * / param [in] деректерінде табуға болады Шифрлеуге арналған сөздер (16 -ға бөлінуі керек, максималды ұзындығы 240) * / param [in] шифрланатын сөздердің ұзындығы (16 -ға бөлінуі керек), максималды ұзындығы 240) * / param [out] iv AES CBC -де пайдаланылатын бастапқы вектор (векторды осы форматта қайтару) * / param [out] шифрлік мәтін осында Cypher мәтінін қайтарады * / param [in] пернесінің ұя нөмірі перне * / ATCA_SUCCESS табысқа қайтарады, әйтпесе қате коды. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *деректер, int len, uint8_t *iv, uint8_t *шифрлі мәтін, uint8_t кілті) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F («ERROR: ATCA_BAD_PARAM»)); ATCA_BAD_PARAM қайтару; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS күйі = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F («ERROR Encrypt: atcab_aes_cbc_init, 0x код қатесі»)); Serial.println (күй, HEX); қайтару; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & шифр мәтіні [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F («ERROR Encrypt: atcab_aes_cbc_encrypt_block, 0x код қатесі»)); Serial.println (күй, HEX); } қайтару күйі; } қайтару күйі; }

Бұл функцияны қолдану оңай, сізге екі нәрсені орнату қажет:

  1. 16 байтты бос IV (бастапқы вектор)
  2. Шифрланатын мәліметтер (максималды өлшемі 240 байт)

Міне, «бұл функцияны қолдану әдісі» мысалы.

Мен «AAAAAAAAAAAAAAAA» сөзін шифрлағым келеді, кілт «9» ұяшығына жазылған:

ATCA_STATUS күйі = atcab_init (& cfg); егер (күй! = ATCA_SUCCESS) {Serial.println (F («atcab_init () сәтсіз аяқталды: Code -> 0x»)); Serial.println (күй, HEX); } uint8_t ашық мәтін [16] = «AAAAAAAAAAAAAAAA»; // Түпнұсқа мәтін uint8_t iv [IV_LENGTH_CBC]; // Бастапқы вектор uint8_t cypherdata [sizeof (қарапайым мәтін)]; // Деректердің шифрланған күйі = aes_cbc_encrypt (& cfg, ашық мәтін, sizeof (ашық мәтін), iv, cypherdata, 9);

Егер әрекет жақсы болса, сізде «cypherdata» айнымалысында шифрланған деректер болады және «IV» айнымалысында бастапқы вектор болады.

Мәтіннің шифрын ашу үшін осы екі айнымалы мәнді сақтаңыз!

Екінші қадам: деректердің шифрын ашу

Деректердің шифрын ашу үшін сізге екі нәрсе қажет:

  1. Бастапқы вектор
  2. Cypher деректері (шифрланған деректер)

Деректердің шифрын ашу үшін сізге келесі функция қажет:

/** / қысқаша AES CBC алгоритмі көмегімен деректердің шифрын шешіңіз* / param [in] cfg Логикалық интерфейс конфигурациясы. Кейбір алдын ала анықталған * конфигурацияларды atca_cfgs.h * / param [in] шифрлі мәтіннен табуға болады Шифрді шешуге арналған сөздер (16 -ға бөлінуі керек, максималды ұзындығы 240) * / param [in] ұзындығы шешілетін сөздердің ұзындығы (16 -ға бөлінуі керек), максималды ұзындығы 240) * / param [in] iv AES CBC -де қолдануға арналған бастапқы вектор * / param [out] ашық мәтін осында шифрланған мәтінді қайтарады * / param [in] кілттің ұяшық нөмірі * / табысқа ATCA_SUCCESS қайтарады., әйтпесе қате коды. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *шифрленген мәтін, int len, uint8_t *iv, uint8_t *ашық мәтін, uint8_t кілті) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F («ERROR Decrypt: ATCA_BAD_PARAM»)); ATCA_BAD_PARAM қайтару; } ATCA_STATUS күйі = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F («ERROR Decrypt: atcab_aes_cbc_init, 0x код қатесі»)); Serial.println (күй, HEX); қайтару; } int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & textte [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F («ERROR Decrypt: atcab_aes_cbc_encrypt_block, 0x код қатесі»)); Serial.println (күй, HEX); } қайтару күйі; } қайтару күйі; }

Мен бұрынғы деректерімнің шифрын шешкім келеді (төменде қараңыз, Бірінші қадам). Ол үшін мен мұны істеймін:

uint8_t ашық мәтін [16] = «AAAAAAAAAAAAAAAA»; uint8_t iv [IV_LENGTH_CBC]; uint8_t шифрлық деректер [sizeof (ашық мәтін)]; uint8_t шифрлау деректері [sizeof (ашық мәтін)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print («Шифрланған мәтін - бұл:»); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println («»); } else {// Erca Serial.print коды үшін atca_status.h файлын қараңыз (F («Шифрды шешудің мүмкін еместігі | Код қатесі 0x»)); Serial.println (күй, HEX); қайтару; }

Егер әрекет жақсы болса, сізде «decryptdata» айнымалысында шифрланған деректер болады.

Енді сіз Atecc608a чипінің көмегімен шифрлау мен шифрды қалай пайдалану керектігін білесіз

6 -қадам: 5. Неліктен сізге бұл чипті пайдалану қажет?

Шифрланған деректер өте пайдалы, себебі сіз ақпаратты жасыра аласыз және оны сымсыз жібере аласыз немесе оны сақтай аласыз.

Қолданудың бірнеше мысалы:

  1. Сыртқы EEPROM -да сақталған деректер: Сіз сыртқы EEPROM деректерін қауіпсіздей аласыз, ал егер бұл EEPROM әлі де болса, оған шифрды шешуге кілт пен IV қажет болады.
  2. Сымсыз деректерді жіберу: Сіз бұл шифрланған деректерді Wireless арқылы жібере аласыз (nrf24L01, RFM95W…) және егер сіздің деректеріңізді біреу ұстап қалса, бұл деректер қауіпсіз болады.
  3. Сақталған құпия сөз

Бұл чиптің көмегімен сіз көп нәрсені жасай аласыз. Оны бірнеше жобада қолдануға болады. Егер сізде уақыт болса, айтыңызшы, бұл чипті қандай жобада қолданасыз?

Соңғы кеңес, егер сіз сымсыз жоба жасасаңыз немесе шикі деректерді сақтасаңыз, абай болыңыз, қауіпсіздік өте маңызды және егер сіз «noob» сіздің деректерді ұстап алу немесе ұрлаудың қарапайым екенін білсеңіз. Енді Интернетте кез келген адам компьютерде сізді «бұзу» үшін іске қосатын сценарийлерге ие бола алады!

7 -қадам: Қорытынды

Бұл мақала сіз үшін пайдалы болады деп сенемін. Кешіріңіз, егер мен мәтіннен қателескен болсам, бірақ ағылшын тілі менің негізгі тілім емес, мен жазғаннан гөрі жақсы сөйлеймін.

Барлығын оқығаныңыз үшін рахмет.

Ләззат ал.

Ұсынылған: