Съдържание:

Сигурност с Arduino: Atecc608a: 7 стъпки
Сигурност с Arduino: Atecc608a: 7 стъпки

Видео: Сигурност с Arduino: Atecc608a: 7 стъпки

Видео: Сигурност с Arduino: Atecc608a: 7 стъпки
Видео: LDmicro 7: Simple Intruder Alarm Logic (Microcontroller PLC Ladder Programming with LDmicro) 2024, Юли
Anonim
Сигурност с Arduino: Atecc608a
Сигурност с Arduino: Atecc608a
Сигурност с Arduino: Atecc608a
Сигурност с Arduino: Atecc608a

Тема

Здравейте всички !

Това е първата ми статия с инструкции, така че се надявам да бъде интересна за всички вас.

В тази статия ще ви обясня как да използвате микрочип, наречен "ATECC608A", който предоставя множество инструменти за сигурност.

Този чип е проектиран от MicroChip и е последната версия на "чип CryptoAuthentication". Преди тази версия имаше „ATSHA204A“и „ATECC508A“.

Защо реших да използвам последната версия, а не предишната?

Тази версия е най -модерният чип и има функционалности, които старата версия няма (Например: AES модул, IO защитен модул …).

Защо този проект?

Работя в областта на CyberSecurity и като всеки обичах програмирането и електрониката. По време на следването си получавам конференция със специалист по IoT Security, който ни показа, че Industrial не използва Security в своя IoT обект. Показах ни катинар, който може да бъде отворен с вашия смартфон чрез Bluetooth. На катинара имаше изречение „Този катинар е най -сигурен от ключалка с ключ!“. Това изречение го кара да се усмихва и той променя изречението „Този катинар е най -лошият катинар, който някога е бил построен!“.

Той ни показа със собствен компютър и Bluetooth снифър, че всяка команда, изпратена от смартфона, е една и съща всеки път и е много лесно да копирате тази команда и да я изпратите с вашия смартфон. Той ни обясни, че „Сигурността“за „Индустриален“не е основният проблем. Той ни показа чипове (по -малко от 0,60 $), които биха могли да добавят слой сигурност към тези обекти.

След тази демонстрация се опитах да намеря някакъв проект с отворен код, който добавя защитен слой към обекта на IoT, но така и не го намерих.

Затова реших да работя по проект, който използва защитен слой за комуникация между два IoT обекта.

Каква е моята идея?

По време на комуникация между два IoT обекта могат да съществуват множество атаки: Man Of the blag, Copy of information и др. Така че идеята ми е много проста:

  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.

Второ, когато използвате този чип, трябва да заключите неговата конфигурация и е невъзможно да промените конфигурацията на чипа, ако е заключен. Затова бъдете внимателни, когато заключвате Config Zone и Data Zone.

Трето, библиотеката, написана на C, е много голяма и пълна, така че трябва да прочетете документацията на функциите, които ще използвате преди.

Четвърто, библиотеката пише, че този чип не работи за Arduino UNO, но добавя функционалностите, от които се нуждае, за да работи с Arduino UNO.

Чипът ATECC608A

Можете да комуникирате с този чип чрез I2C. Адресът на този чип може да бъде променен в конфигурацията.

Този чип съдържа 16 различни слота, които могат да съдържат различен тип данни:

  1. ECC ключ (частен или публичен)
  2. AES ключ
  3. Други данни (като Sha has или просто думи)

В нашия случай ще съхраняваме AES Key в един слот.

Стъпка 3: 1. Проектиране на веригата

1. Проектиране на веригата
1. Проектиране на веригата
1. Проектиране на веригата
1. Проектиране на веригата

1. Проектиране на веригата

Схемата на тази схема е много проста!

Трябва да използвате 3.3V мощност, защото препоръката е между 2.0V и 5.5V, но аз предпочетох да използвам 3.3V.

За този чип обикновено имате точка в ъгъла на чипа, тази точка е Pin 1 на тази платка. Добавих изглед отгоре на Atecc608a с ПИН номер, защото е 8-оловен SOIC, така че чипът е много малък.

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

Трябва да използвате 3.3V мощност, защото препоръката е между 2.0V и 5.5V, но аз предпочетох да използвам 3.3V.

Добавих изглед отгоре на Atecc608a, защото той е 8-оловен SOIC, така че чипът е много малък. Ако предпочитате, така че доставчиците изграждат някаква дъска с чип спойка, може да ви бъде по -лесно.

Предупреждение: В моя случай трябва да добавя резистор между SDA на Arduino и чипа (също за SDL). Добавих 4,7Kohm резистор за всеки.

Стъпка 4: 2. Конфигурация на чипа (Atecc608a)

Преди да използвате функцията за криптиране или декриптиране, трябва да конфигурирате чипа. В тази стъпка ще опиша подробно всички стъпки, които трябва да направите за конфигурирането на този чип.

Внимание: тази стъпка е много важна и ако заключите зоните преди края, не можете да ги промените.

Както беше обяснено по -рано, този чип има две зони:

  1. Конфигуриране на зона
  2. Зона за данни

Конфигурационната зона има размер от 128 байта, но първите 16 байта не могат да бъдат променяни.

За да конфигурирате този чип, трябва да изпълните две стъпки. Много е важно да следвате всички стъпки, за да не работи вашата конфигурация, а чипът ви ще бъде заключен и неизползваем. Тези стъпки са:

  1. Създайте шаблон за конфигурация
  2. Напишете този шаблон на чипа
  3. Заключете Config Zone
  4. Напишете своя AES ключ (128 бита) в слот
  5. Заключете зоната за данни

Информация

По -долу подробно описвам всяка стъпка от конифгурацията с моя код, но без притеснения, добавих пълен пример за конфигурация в моя Github. Поставям коментари за всяка функция, а *.ino файл е достъпен с всяка стъпка, за да ви помогна.

  • Моят Github: Моят Github
  • Път на примерна конфигурация: configuration_example.ino

Първа стъпка: Създайте шаблон за конфигурация

Както беше обяснено по -рано, конфигурационната зона получава размер от 128 бита, но първите 16 бита не могат да бъдат променени. Тази зона се състои от множество части, но трябва да знаете само 3 части от тази конфигурационна зона за този проект:

  1. Байтовете 16 -> Това е I2C адресът на чипа
  2. Байтовете от 20 до 51 -> Тук можете да промените типа слот за 16 -те слота на този чип
  3. Байтовете 96 до 127 -> Тук можете да зададете Тип ключ или данни, използвани във всеки слот.

(Ако имате нужда от допълнително обяснение на цялата тази зона, моля, прочетете документацията (страница 13, раздел 2.2))

Тук поставям подробности всеки байт/части от 112 байта от конфигурацията на чип. Това е пример, всеки закупен чип може да има различна конфигурация:

0xC0, // I2C адрес

0x00, 0x00, 0x00, 0x83, 0x20, // Слот за конфигуриране на слот 1 0x85, 0x20, // Слот за конфигуриране на слот 2 0x8F, 0x20, // Слот за конфигуриране на слот 3 0xC4, 0x8F, // Слот за конфигуриране на слот 4 0x8F, 0x8F, // Слот за конфигуриране на слот 5 0x8F, 0x8F, // Слот за конфигуриране на слот 6 0x9F, 0x8F, // Слот за конфигуриране на слот 7 0x0F, 0x0F, // Слот за конфигуриране на слот 8 0x8F, 0x0F, // Слот за конфигуриране на слот 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, // Слот за конфигуриране на слот 15 0xAF, 0x8F, // Слот за конфигуриране на слот 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, 0xFF, 0xFF, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Слот за конфигуриране на ключ 1 0x33, 0x00, // Слот за конфигуриране на ключ 2 0x33, 0x00, // Слот за конфигуриране на ключ 3 0x1C, 0x00, // Слот за конфигуриране на ключ 4 0x1C, 0x00, // Слот за конфигуриране на ключ 5 0x 1C, 0x00, // Слот за конфигуриране на ключ 6 0x1C, 0x00, // Слот за конфигуриране на ключ 7 0x3C, 0x00, // Слот за конфигуриране на ключ 8 0x1A, 0x00, // Слот за конфигуриране на ключ 9 0x3A, 0x00, // Слот за конфигуриране на ключ 10 0x1A, 0x00, // Слот за конфигуриране на ключ 11 0x3A, 0x00, // Слот за конфигуриране на ключ 12 0x3A, 0x00, // Слот за конфигуриране на ключ 13 0x3C, 0x00, // Слот за конфигуриране на ключ 14 0x3C, 0x00, // Слот за конфигуриране на ключ 15 0x1C, 0x00 // Слот за конфигуриране на ключ 16

Както виждам, поставям някои коментари в този код, за да разбера повече тази конфигурация.

Във вашия случай трябва да разберете само три неща:

  1. Байтовете 16 -> Това е I2C адресът на чипа
  2. Байтовете от 20 до 51 -> Тук можете да промените типа слот за 16 -те слота на този чип
  3. Байт 96 до 127 -> Тук можете да зададете Тип ключ или данни, използвани във всеки слот.

Няма да обяснявам типа конфигурация и защо използвах тази, а не друга, защото е сложно да се обясни всичко. Ако имате нужда от повече информация, отидете в документацията, страница 16, раздел 2.2.1 за „SlotConfig“и страница 19, раздел 2.2.5 за „KeyConfig“

За този пример ще използвате слота 9 за съхраняване на AES ключ.

За това трябва да поставим (ако имате нужда, можете да копирате горния пример, модификацията е направена в него):

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

Защо зададох тази конфигурация: За всеки слот на този чип можете да зададете параметри, за да кажете на чипа какъв тип данни ще се съхраняват. Имате няколко параметъра:

  • Слотът може да се записва или чете (изчистване или криптиране на действие)
  • Тип съхранени данни (ECC ключ, публичен ключ, SHA хеш, AES ключ …)
  • Слотът може да се заключва
  • Генерирането на ключ е разрешено

С байт 36 и 37, зададен на "0x0F8F":

  • Данните могат да бъдат записани в Clear
  • Съдържанието на този слот е секретно и не може да се чете
  • Слотът не може да се използва за командата CheckMac Copy

С байт 112 и 113, зададен на "0x001A":

Слотът може да съхранява до четири 128-битови симетрични ключа AES (KeyType = 0x6)

Втора стъпка: Напишете тази конфигурация

Тази стъпка е много важна, защото ще зададем чипа с нашата конфигурация и ако тази конфигурация не е добра, ще използвате този чип.

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

Ето това е кодът, използван за запис на конфигурацията в чипа:

/** / brief Напишете нова конфигурация на чипа.

* / 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 статус; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Запишете конфигурационния масив към чипа // Подплата от 16 байта (16 първи байта не могат да бъдат записани) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); статус на връщане; } състояние на връщане; }

Тази функция ще запише вашата конфигурация в чипа.

Трета стъпка: заключете конфигурационната зона

Внимание: бъдете внимателни с тази стъпка, ако заключите тази зона и конфигурацията ви не е добра, чипът е неизползваем и не можете да промените тази зона

За това действие ще използваме тази функция:

/** / short Проверете дали DATA_ZONE или CONFIG_ZONE са заключени

* / param [in] cfg Конфигурация на логически интерфейс. Някои предварително зададени * конфигурации могат да бъдат намерени в atca_cfgs.h * / param [в] зона LOCK_ZONE_DATA или LOCK_ZONE_CONFIG * / връщане на ATCA_SUCCESS при успех, в противен случай код на грешка. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t зона) {ATCA_STATUS статус; bool lock = false; ако (зона! = (uint8_t) LOCK_ZONE_CONFIG && зона! = (uint8_t) LOCK_ZONE_DATA) връщане ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (зона, & заключване))) {връщане 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 байта данни. Затова реших да пиша на ключ от 16 байта всеки в този слот, за да има 32 байта данни.

Сега ще ви покажа използвания код:

/** / кратко Напишете AES ключ в даден слот. * / param [in] cfg Конфигурация на логически интерфейс. Някои предварително дефинирани * конфигурации могат да бъдат намерени в atca_cfgs.h * / param [in] номер на слота за ключови ключове * / param [in] масив от ключове за данни uint8_t * / param [in] len Размер на ключовия масив * / връщане ATCA_SUCCESS при успех, в противен случай код на грешка. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, 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, ключ за данни, 32); if (status! = ATCA_SUCCESS) връщане на състоянието; } състояние на връщане; }

За този пример ще използвам два AES ключа по 16 байта всеки:

// Пример за AES KEY (лен 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Ако това действие е добро, сега трябва да преминете последната стъпка "заключване на зоната за данни"

Последна стъпка: заключете зоната за данни

Внимание: бъдете внимателни с тази стъпка, ако заключите тази зона и вашите данни не са зададени, чипът е неизползваем и не можете да промените тази зона

За това действие ще използваме тази функция:

/** / short Проверете дали DATA_ZONE или CONFIG_ZONE са заключени

* / param [in] cfg Конфигурация на логически интерфейс. Някои предварително зададени * конфигурации могат да бъдат намерени в atca_cfgs.h * / param [в] зона LOCK_ZONE_DATA или LOCK_ZONE_CONFIG * / връщане на ATCA_SUCCESS при успех, в противен случай код на грешка. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t зона) {ATCA_STATUS статус; bool lock = false; if (зона! = (uint8_t) LOCK_ZONE_CONFIG && зона! = (uint8_t) LOCK_ZONE_DATA) връщане ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (зона, & заключване))) {връщане 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 хеш) (вижте wikipedia за повече обяснения)

За да улесня използването, създадох две функции:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Тези две функции са налични на моя Github.

Експликация

Избирам да използвам AES CBC алгоритъма, защото е по -безопасен от основните AES 128 бита. Този алгоритъм използва начален вектор за криптиране на вашите данни.

Информация

По -долу описвам всяка стъпка от метода на криптиране и декриптиране. Но написах код за Arduino, който използва и двете функции. Можете да видите този код в моя Github:

  • Github: Моят Github
  • Пример за код "Шифроване/Декриптиране": AES_crypto_example.ino

Първа стъпка: Шифроване на вашите данни

В тази част ще ви покажа как да шифровате данните си.

Първо ще ви трябва тази функция:

/** / short Шифроване на данни с помощта на AES CBC алгоритъм* / param [in] cfg Конфигурация на логически интерфейс. Някои предварително дефинирани * конфигурации могат да бъдат намерени в atca_cfgs.h * / param [in] data Думи за енциптиране (трябва да бъдат разделени на 16, максимална дължина 240) * / param [in] len дължина на Words to encypt (трябва да бъде разделена на 16, макс. дължина 240) * / param [out] iv Начален вектор, използван в AES CBC (връщане на вектора в този var) * / param [out] шифров текст връща тук шифровия текст * / 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 ("ГРЕШКА: ATCA_BAD_PARAM")); връщане ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [лен]; ATCA_STATUS статус = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, ключ, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ГРЕШКА Шифроване: 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, Code Error 0x")); Serial.println (статус, HEX); } състояние на връщане; } състояние на връщане; }

Тази функция е лесна за използване, трябва да зададете две неща:

  1. Празен IV (начален вектор) от 16 байта
  2. Данни за шифроване (макс. Размер 240 байта)

Ето пример "как да използвам тази функция".

Искам да шифровам думата "AAAAAAAAAAAAAAA", като ключът ми пише в слота номер "9":

ATCA_STATUS статус = atcab_init (& cfg); if (статус! = ATCA_SUCCESS) {Serial.println (F ("неуспешно atcab_init (): Код -> 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 [в] шифрован текст Думи за декриптиране (трябва да бъдат разделени на 16, максимална дължина 240) * / param [in] len дължина на Думи за декриптиране (трябва да бъде разделена на 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 ("ГРЕШКА Декриптиране: ATCA_BAD_PARAM")); връщане ATCA_BAD_PARAM; } ATCA_STATUS статус = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, ключ, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ГРЕШКА Декриптиране: 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], & plaintext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ГРЕШКА Декриптиране: atcab_aes_cbc_encrypt_block, Кодова грешка 0x")); Serial.println (статус, HEX); } състояние на връщане; } състояние на връщане; }

Искам да дешифрирам предишните си данни (вижте по -долу, Първа стъпка). За това ще направя следното:

uint8_t открит текст [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [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 {// Вижте файла atca_status.h за кода Error Serial.print (F ("Невъзможно е декриптирането | Code Error 0x")); Serial.println (статус, HEX); връщане; }

Ако действието е добро, ще имате дешифрирани данни в променливата "decryptdata".

Сега знаете как да използвате криптиране и декриптиране с чипа Atecc608a

Стъпка 6: 5. Защо трябва да използвате този чип

Шифрованите данни са много полезни, защото можете да скриете информацията си и да я изпратите чрез безжична връзка или просто да я съхраните.

Ето някои примери за използване:

  1. Съхранени данни към външен EEPROM: Можете да защитите данни от външен EEPROM и ако някой все още е този EEPROM, той ще се нуждае от ключа и IV за декриптирането
  2. Изпращане на безжични данни: Можете да изпращате тези криптирани данни чрез безжична връзка (nrf24L01, RFM95W …) и ако някой прехване вашите данни, тези данни ще бъдат защитени
  3. Съхранена парола

Можете да правите няколко неща с този чип. Може да се използва в множество проекти. Ако имате време, кажете ми в какъв проект ще използвате този чип?

Един последен съвет, ако изграждате някакъв безжичен проект или съхранявате необработени данни, бъдете внимателни, сигурността е много важна и ако знаете как е лесно за „нуб“да прихване или открадне вашите данни. Сега с интернет всеки може да има скриптове за стартиране на компютъра си, само за да ви „хакне“!

Стъпка 7: Заключение

Надявам се тази статия да ви бъде полезна. Съжалявам, ако допуснах грешка в текста си, но английският не е основният ми език и говоря по -добре, отколкото пиша.

Благодаря, че прочетохте всичко.

Наслаждавай се.

Препоръчано: