Оглавление:

Безопасность с Arduino: Atecc608a: 7 шагов
Безопасность с Arduino: Atecc608a: 7 шагов

Видео: Безопасность с Arduino: Atecc608a: 7 шагов

Видео: Безопасность с Arduino: Atecc608a: 7 шагов
Видео: Аутентификация устройств на Linux по аппаратному ключу в системах верхнего уровня/Евгений Богер 2024, Ноябрь
Anonim
Безопасность с Arduino: Atecc608a
Безопасность с Arduino: Atecc608a
Безопасность с Arduino: Atecc608a
Безопасность с Arduino: Atecc608a

Тема

Всем привет !

Это моя первая статья с инструкциями, поэтому я надеюсь, что она будет интересна всем вам.

В этой статье я объясню вам, как использовать микрочип под названием «ATECC608A», который предоставляет несколько инструментов безопасности.

Этот чип был разработан MicroChip и является последней версией «чипа CryptoAuthentication». До этой версии были «ATSHA204A» и «ATECC508A».

Почему я решил использовать последнюю версию, а не предыдущую?

Эта версия является наиболее продвинутой микросхемой и имеет функции, которых нет в старой версии (например: модуль AES, модуль защиты ввода-вывода…).

Почему именно этот проект?

Я работаю в сфере кибербезопасности и, как все, я любил программирование и электронику. Во время учебы я участвовал в конференции со специалистом по безопасности Интернета вещей, который показал нам, что Industrial не использует безопасность в своем объекте Интернета вещей. Я показал нам замок, который можно открыть с помощью смартфона через Bluetooth. На замке было написано: «Этот замок надежнее, чем замок с ключом!». Это предложение заставило его улыбнуться, и он изменил предложение «Этот замок - худший замок, который когда-либо строили!».

Он показал нам с помощью своего ПК и анализатора Bluetooth, что все команды, отправляемые смартфоном, всегда одинаковы, и очень просто скопировать эту команду и отправить ее на свой смартфон. Он объяснил нам, что «Безопасность» для «Промышленности» не является главной проблемой. Он показал нам микросхемы (менее 0,60 $), которые могут повысить уровень безопасности этих объектов.

После этой демонстрации я попытался найти какой-нибудь проект с открытым исходным кодом, который добавляет уровень безопасности к объекту 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 не из легких.

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

Во-вторых, когда вы используете этот чип, вам необходимо заблокировать его конфигурацию, и невозможно изменить конфигурацию чипа, если он заблокирован. Поэтому будьте осторожны, когда будете блокировать зону конфигурации и зону данных.

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

В-четвертых, библиотека, написанная для этого чипа, не работает для Arduino UNO, но она добавила функции, необходимые для работы с Arduino UNO.

Микросхема ATECC608A

Вы можете общаться с этим чипом по I2C. Адрес этого чипа можно изменить в конфигурации.

Этот чип содержит 16 различных слотов, которые могут содержать разные типы данных:

  1. Ключ ECC (частный или открытый)
  2. Ключ AES
  3. Другие данные (например, Sha hash или просто слова)

В нашем случае мы будем хранить ключ AES в одном слоте.

Шаг 3: 1. Проектирование схемы

1. Проектирование схемы
1. Проектирование схемы
1. Проектирование схемы
1. Проектирование схемы

1. Устройство схемы

Схема этой схемы очень проста!

Вам нужно использовать питание 3,3 В, потому что рекомендуется от 2,0 В до 5,5 В, но я предпочел использовать 3,3 В.

Для этого чипа обычно у вас есть точка на углу чипа, эта точка является выводом 1 этой платы. Я добавил вид сверху на 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, поэтому чип очень маленький. Если вы предпочитаете, чтобы поставщики построили плату с припоем для микросхем, это может быть проще для вас.

Предупреждение: в моем случае я должен добавить резистор между SDA Arduino и чипом (также для 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. Байты 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, // Конфигурация слота Слот 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, 0x00, 0xFF, 0xFF, 0x00, 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)

Второй шаг: напишите эту конфигурацию

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

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

Вот этот код, используемый для записи конфигурации в микросхему:

/ ** / кратко Записать новую конфигурацию в микросхему.

* / param [in] cfg Конфигурация логического интерфейса. Некоторые предопределенные * конфигурации можно найти в atca_cfgs.h * / param [in] config Массив uint8_t конфигурации (длина 112) * / param [in] len Размер массива конфигурации * / return 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); статус возврата; } статус возврата; }

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

Третий шаг: заблокируйте конфигурационную зону

Предупреждение: будьте осторожны с этим шагом, если вы заблокируете эту Зону и ваша конфигурация неправильная, микросхема непригодна для использования, и вы не сможете изменить эту зону

Для этого действия мы будем использовать эту функцию:

/ ** / short Проверить, заблокирована ли DATA_ZONE или CONFIG_ZONE

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

Четвертый шаг: напишите вам ключ AES в слот

В этой части вы установите персональный ключ AES в слот, который вы определили в конфигурации микросхемы.

В этом примере я буду использовать 9-й слот микросхемы.

Вам необходимо знать: Особенностью этого чипа является то, что вы можете записывать данные в слот только на 4 или 32 байта. Для AES нам нужен 128-битный ключ, поэтому 16 байт данных. Поэтому я решил записать в ключ по 16 байтов каждый в этом слоте, чтобы иметь 32 байта данных.

Теперь я покажу вам используемый код:

/ ** / short Записать ключ AES в заданный слот. * / param [in] cfg Конфигурация логического интерфейса. Некоторые предопределенные * конфигурации можно найти в atca_cfgs.h * / param [in] номер слота ключа ключа * / param [in] массив ключей данных uint8_t * / param [in] len Размер массива ключей * / return ATCA_SUCCESS в случае успеха, в противном случае - код ошибки. * / ATCA_STATUS write_key_slot (ATCAIfaceCfg * cfg, uint8_t key, uint8_t * datakey, size_t len) {if (key 16) return ATCA_BAD_PARAM; если (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) вернуть статус; } статус возврата; }

В этом примере я буду использовать два ключа AES по 16 байт каждый:

// Пример AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Если с этим действием все в порядке, теперь вам нужно пройти последний шаг «заблокировать зону данных».

Последний шаг: заблокируйте зону данных

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

Для этого действия мы будем использовать эту функцию:

/ ** / short Проверить, заблокирована ли DATA_ZONE или CONFIG_ZONE

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

Информация

Ниже я подробно описываю каждый шаг метода шифрования и дешифрования. Но я написал код для Arduino, который использует обе эти функции. Вы можете увидеть этот код в моем Github:

  • Github: Мой Github
  • Пример кода «Зашифровать / расшифровать»: AES_crypto_example.ino

Первый шаг: зашифруйте свои данные

В этой части я покажу вам, как зашифровать ваши данные.

Для начала вам понадобится эта функция:

/ ** / short Шифрование данных с использованием алгоритма AES CBC * / param [in] cfg Конфигурация логического интерфейса. Некоторые предопределенные * конфигурации можно найти в atca_cfgs.h * / param [in] data Words для шифрования (должно быть разделено на 16, максимальная длина 240) * / param [in] len длина слов для шифрования (необходимо разделить на 16, максимальная длина 240) * / param [out] iv Начальный вектор, используемый в AES CBC (вернуть вектор в этой переменной) * / param [out] зашифрованный текст вернуть здесь текст Cypher * / param [in] key Номер слота key * / return ATCA_SUCCESS в случае успеха, в противном случае - код ошибки. * / ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg * cfg, uint8_t * data, int len, uint8_t * iv, uint8_t * ciphertext, uint8_t key) {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 [len]; Статус ATCA_STATUS = atcab_init (cfg); если (статус == ATCA_SUCCESS) {статус = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (статус, HEX); возвращение; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; для (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & ciphertext [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 (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () не удалось: код -> 0x")); Serial.println (статус, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Исходный текст uint8_t iv [IV_LENGTH_CBC]; // Начальный вектор uint8_t cypherdata [sizeof (plaintext)]; // Данные зашифрованы status = aes_cbc_encrypt (& cfg, plaintext, sizeof (plaintext), iv, cypherdata, 9);

Если действие выполнено успешно, у вас будут зашифрованные данные в переменной "cypherdata" и исходный вектор в переменной "IV".

Сохраните эти две переменные, чтобы расшифровать текст!

Второй шаг: расшифруйте ваши данные

Для расшифровки ваших данных вам понадобятся две вещи:

  1. Начальный вектор
  2. Данные Cypher (зашифрованные данные)

Для расшифровки ваших данных вам понадобится эта функция:

/ ** / short Расшифровать данные с помощью алгоритма AES CBC * / param [in] cfg Конфигурация логического интерфейса. Некоторые предопределенные * конфигурации можно найти в atca_cfgs.h * / param [in] зашифрованные слова для расшифровки (необходимо разделить на 16, максимальная длина 240) * / param [in] len длина слов для расшифровки (необходимо разделить на 16, максимальная длина 240) * / param [in] iv Начальный вектор для использования в AES CBC * / param [out] открытый текст возвращает здесь расшифрованный текст * / param [in] key Номер слота ключа * / return ATCA_SUCCESS в случае успеха, иначе код ошибки. * / ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg * cfg, uint8_t * ciphertext, int len, uint8_t * iv, uint8_t * plaintext, uint8_t key) {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 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, Code Error 0x")); Serial.println (статус, HEX); возвращение; } int max = len / 16; для (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 ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (статус, HEX); } статус возврата; } статус возврата; }

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

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (открытый текст)]; uint8_t decryptdata [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 («Невозможно выполнить дешифрование | Ошибка кода 0x»)); Serial.println (статус, HEX); возвращение; }

Если действие выполнено успешно, у вас будут расшифрованные данные в переменной «decryptdata».

Теперь вы знаете, как использовать шифрование и дешифрование с помощью микросхемы Atecc608a

Шаг 6: 5. Зачем вам нужен этот чип

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

Вот пример использования:

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

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

Последний совет: если вы создаете беспроводной проект или храните необработанные данные, будьте осторожны, безопасность очень важна, и если вы знаете, как «новичку» легко перехватить или украсть ваши данные. Теперь, когда есть Интернет, каждый может иметь скрипты для запуска на своем компьютере, чтобы просто «взломать» вас!

Шаг 7: Заключение

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

Спасибо, что все прочитали.

Наслаждайся этим.

Рекомендуемые: