Съдържание:
- Консумативи
- Стъпка 1: 1. Настройте Atecc608a
- Стъпка 2: 2. Проектиране на веригата (главен и подчинен)
- Стъпка 3: 3. Кодът (Slave и Master)
- Стъпка 4: 4. Продължете напред
- Стъпка 5: Заключение
Видео: Безжична шифрована комуникация Arduino: 5 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Здравейте всички, Във втората статия ще ви обясня как да използвате чипа Atecc608a за защита на вашата безжична комуникация. За това ще използвам NRF24L01+ за безжичната част и Arduino UNO.
Микрочипът ATECC608A е проектиран от MicroChip и има множество инструменти за сигурност. Например, този чип може да съхранява ECC ключове, AES ключове (за AES 128) и SHA2 Hash.
Статията: NRF24L01 + Arduino UNO + ATECC608A
По време на комуникация между два IoT обекта могат да съществуват множество атаки: Man Of the blag, Copy of information и др. Така че идеята ми е много проста:
- Използване на криптирани данни между два или повече IoT обекта.
- Евтини консумативи
- Може да работи с Arduino UNO
В моя случай използвам
- Atecc608a за съхраняване на моя AES ключ и за криптиране/декриптиране на данните ми.
- Arduino Uno като микроконтролер
- NRF24L01 за изпращане на моите данни
Трябва да следвате тези стъпки за този проект:
- Настройте чипа ATECC608A
- Направете веригата (главен възел и подчинен възел)
- Кодова част
- Продължи напред !
За първите стъпки „Настройка на чипа ATECC608A“написах друга статия, която обяснява всяка стъпка по ред. Връзката е тук:
Сега започнете!
Консумативи
За този проект се нуждаете от:
- 2 Arduino UNO или Arduino NANO или Arduino Mega
- Някакъв проводник
- 2 Atecc608a (всеки струва по -малко от 0,60 $)
- 2 NRF24L01+
- 2 кондензатор (10 μF)
- Платки
Връзка към моята статия, която обяснява как да настроите чипа ATECC608A -> Как да настроите Atecc608a
Стъпка 1: 1. Настройте Atecc608a
Няма да описвам подробно всяка стъпка, която да следвам, за да настроя ATECC608A, защото написах пълна статия, която обяснява всички стъпки за това. За да го настроите, трябва да следвате „Стъпка 4“от тази статия, наречена „2. Конфигурация на чипа (Atecc608a)“
Връзката е: Как да настроите ATECC608A
Също така трябва да поставите същата конфигурация за Atecc608a, главната и подчинената страна, в противен случай няма да можете да декриптирате данните си
Внимание:
За да настроите този чип, трябва да следвате последователно всички стъпки от статията по -горе. Ако една стъпка липсва или чипът не е заключен, няма да можете да направите този проект
Остатък:
Следваща стъпка за това:
- Създайте шаблон за конфигурация
- Напишете този шаблон на чипа
- Заключете Config Zone
- Напишете своя AES ключ (128 бита) в слот
- Заключете зоната за данни
Стъпка 2: 2. Проектиране на веригата (главен и подчинен)
В този проект ще имате главен възел и подчинен възел.
Главният възел ще отпечата ясно изпратените данни от подчинения възел. Той ще изисква данни от подчинения възел всеки X път.
Подчиненият възел ще слуша "мрежата" и когато получи "Заявка за данни", той ще го генерира, ще го шифрова и ще го изпрати до главния възел.
И за двете страни, главна и подчинена веригата е една и съща:
- Един arduino Nano
- Един ATECC608A
- Един NRF24L01
Прикрепих веригата към тази стъпка (ср. Снимката по -горе).
За ATECC608A към Arduino UNO това е 8 -пинов soic. Добавих „горния изглед“по -горе:
- ARDUINO 3.3V -> ПИН 8 (Atecc608a)
- ARDUINO GND -> ПИН 4 (Atecc608a)
- ARDUINO A4 (SDL) -> ПИН 5 (Atecc608a)
- ARDUINO A5 (SCL) -> ПИН 6 (Atecc608a)
За NRF24L01 към Arduino:
- ARDUINO 3.3V -> VCC (nrf24l01)
- ARDUINO GND -> GND (nrf24l01)
- ARDUINO 9 -> CE (nrf24l01)
- ARDUINO 10 -> CSN (nrf24l01)
- ARDUINO 11 -> MOSI (nrf24L01)
- ARDUINO 12 -> MISO (nrf24l01)
- ARDUINO 13 -> SCK (nrf24l01)
- ARDUINO 3 -> IRQ (nrf24l01) -> само за подчинен възел, не се използва в главен режим
Защо да използвате IRQ щифта на NRF24L01
IRQ щифтът е много полезен, този пин позволява да се каже (LOW), когато пакет е получен от NRF24L01, така че можем да прикачим Interrupt към този пин, за да събудим подчинения възел.
Стъпка 3: 3. Кодът (Slave и Master)
Подчинен възел
Използвам енергоспестяване за подчинения възел, защото не е нужно да слуша през цялото време.
Как работи: подчиненият възел слуша и чака да получи "Wake UP пакет". Този пакет се изпраща от главния възел, за да поиска данни от подчинения.
В моя случай използвам масив от два int:
// Събуждане на пакет
const int wake_packet [2] = {20, 02};
Ако моят възел получи пакет,
- той се събужда, прочетете този пакет, ако пакетът е "Wake UP",
- генерира данни,
- шифроване на данните,
- изпратете данните до капитана, изчакайте ACK пакет,
- сън.
За AES Encryption използвам ключ в слота номер 9.
Това е моят код за Slave възела
#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"
#включва "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#include "Wire.h"
// Библиотека ATECC608A
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#дефинирайте ID_NODE 255
#дефинирайте AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
ATCA_STATUS статус;
Радиостанция RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / кратко Функция се изпълнява, когато прекъсването е зададено (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& данни, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17.6; плаващ шум = 16,4;
uint8_t данни [16];
uint8_t cypherdata [16];
// Изграждане на низ за задаване на цялата ми стойност
// Всяка стойност е разделена с "|" и "$" означава края на данните // ПРЕДУПРЕЖДЕНИЕ: Трябва да е по -малко от 11 дължина String tmp_str_data = String (ID_NODE) + "|" + Низ (temp, 1) + "|" + Низ (бръмчене, 1) + "$"; // размер на 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (данни, размер на (данни));
// Шифроване на данните
ATCA_STATUS статус = aes_basic_encrypt (& cfg, data, sizeof (данни), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);
// генериране на UUID на базата на трите първи възел number = ID
Низ uuid = Низ (ID_NODE) + Низ (rand); // Размер 8
uint8_t tmp_uuid [8];
uint8_t данни_до_изпращане [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (data_to_send, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Спиране на слушането на радио.stopListening ();
bool rslt;
// Изпращане на данни rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Започнете да слушате radio.startListening (); if (rslt) {// Краен и спящ режим Serial.println (F ("Готово")); }}}}}
void setup ()
{Serial.begin (9600);
// Инициирайте конструктора за библиотеката
cfg.iface_type = ATCA_I2C_IFACE; // Тип комуникация -> I2C режим cfg.devtype = ATECC608A; // Тип чип cfg.atcai2c.slave_address = 0XC0; // I2C адрес (стойност по подразбиране) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Забавяне на събуждане (1500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Прикрепете прекъсване към щифт 3 // Променете 1 с O, ако искате прекъсването към пина 2 // FALLING MODE = ПИН при НИСКО attachInterrupt (1, wakeUpIRQ, FALLING); }
void loop ()
{ // Няма нужда }
Главен възел
Главният възел се събужда на всеки 8 секунди, за да поиска данни от подчинения възел
Как работи: Главният възел изпраща пакет "WakeUP" на подчинения и след изчакване отговор на подчинения с данни.
В моя случай използвам масив от два int:
// Събуждане на пакет
const int wake_packet [2] = {20, 02};
Ако подчиненият възел изпрати ACK пакет, след като капитанът изпрати WakeUp пакет:
- Капитанът е настроен в режим Слушане и изчакайте комуникация
- Ако комуникацията
- Извлечете първия 8 байт, разграбете трите първи байта от 8 байта, ако това е ID възел
- Извлечете 16 байта на шифър
- Дешифрирайте данните
- Отпечатайте данните в Serial
- Спящ режим
За AES Encryption използвам ключ в слота номер 9.
Това е моят код за Master възела
#включва "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // Библиотека ATECC608A #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #deteine ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS статус; Радиостанция RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Събуждане на пакет const int wake_packet [2] = {20, 02}; // наблюдател прекъсва ISR (WDT_vect) {wdt_disable (); // деактивирам наблюдател} void sleepmode () {// деактивирам ADC ADCSRA = 0; // изчистване на различни флагове за „нулиране“MCUSR = 0; // разрешавам промени, деактивирам нулирането WDTCSR = бит (WDCE) | бит (WDE); // задаваме режим на прекъсване и интервал WDTCSR = бит (WDIE) | бит (WDP3) | бит (WDP0); // задаваме WDIE и 8 секунди забавяне wdt_reset (); // нулиране на караула set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // времевата последователност следва sleep_enable (); // изключете активирането на кафяво изключване в софтуера MCUCR = бит (BODS) | бит (BODSE); MCUCR = бит (BODS); прекъсва (); // гарантира следваща инструкция, изпълнена sleep_cpu (); // отменя съня като предпазна мярка sleep_disable (); } void setup () {Serial.begin (9600); // Инициирайте конструктора за библиотеката cfg.iface_type = ATCA_I2C_IFACE; // Тип комуникация -> I2C режим cfg.devtype = ATECC608A; // Тип чип cfg.atcai2c.slave_address = 0XC0; // I2C адрес (стойност по подразбиране) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Забавяне на събуждане (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Изпращане на данни rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Започнете да слушате radio.startListening (); while (radio.available ()) {uint8_t отговор [32]; radio.read (& answer, sizeof (answer)); uint8_t node_id [3]; uint8_t шифър [16]; memcpy (node_id, отговор, 3); memcpy (шифър, отговор + 3, 16); if ((int) node_id == ID_NODE) {uint8_t изход [16]; ATCA_STATUS статус = aes_basic_decrypt (& cfg, шифър, 16, изход, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Декриптирани данни:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) изход ); }}}}} else {Serial.println ("Ack не се получава за Wakup пакет"); } // Режим на заспиване 8 секунди sleepmode (); }
Ако имате въпроси, аз съм тук, за да отговоря
Стъпка 4: 4. Продължете напред
Този пример е прост, така че можете да подобрите този проект
Подобрения:
- AES 128 е основен и можете да използвате друг алгоритъм на AES като AES CBC, за да бъдете по -безопасни.
- Променете безжичния модул (NRF24L01 е ограничен с полезен товар от 23 байта)
- …
Ако забележите подобрение, обяснете го в дискусионната област
Стъпка 5: Заключение
Надявам се тази статия да ви бъде полезна. Съжалявам, ако допуснах грешка в текста си, но английският не е основният ми език и говоря по -добре, отколкото пиша.
Благодаря, че прочетохте всичко.
Наслаждавай се.
Препоръчано:
Безжична комуникация SmartHome: Екстремните основи на MQTT: 3 стъпки
Безжична комуникация SmartHome: Екстремните основи на MQTT: Основи на MQTT: ** Ще правя серия за домашна автоматизация, ще премина през стъпките, които предприех, за да науча всичко, което съм направил в бъдеще. Този Instructable е базовата линия за това как да настроя MQTT за използване в моите бъдещи Instructables. Хоув
Безжична комуникация LoRa от 3 до 8 км с ниска цена E32 (sx1278/sx1276) Устройство за Arduino, Esp8266 или Esp32: 15 стъпки
Безжична комуникация LoRa от 3 до 8 км с ниска цена E32 (sx1278/sx1276) Устройство за Arduino, Esp8266 или Esp32: Създавам библиотека за управление на EBYTE E32 въз основа на серия Semtech на устройство LoRa, много мощно, просто и евтино устройство. Можете да намерите 3Km версия тук, 8Km версия тук Те могат да работят на разстояние от 3000m до 8000m и имат много функции и
Дълъг обхват, 1,8 км, безжична комуникация между Arduino и Arduino с HC-12 .: 6 стъпки (със снимки)
Дълъг обхват, 1,8 км, безжична комуникация между Arduino и Arduino с HC-12 .: В тази инструкция ще научите как да комуникирате между Arduinos на дълги разстояния до 1,8 км на открито. HC-12 е безжичен сериен порт комуникационен модул, който е много полезен, изключително мощен и лесен за използване. Първо ще напуснеш
Безжична комуникация с помощта на трансивър модул NRF24L01 за проекти, базирани на Arduino: 5 стъпки (със снимки)
Безжична комуникация, използваща трансивер модул NRF24L01 за проекти, базирани на Arduino: Това е вторият ми инструкционен урок за роботите и микроконтролерите. Наистина е невероятно да видите вашия робот жив и работещ според очакванията и повярвайте ми, че ще бъде по -забавно, ако управлявате вашия робот или други неща безжично с бързо и
Как правилно да измерваме консумацията на енергия на модулите за безжична комуникация в епохата на ниска консумация на енергия?: 6 стъпки
Как правилно да измерваме консумацията на енергия на безжичните комуникационни модули в епохата на ниска консумация на енергия?: Ниската консумация на енергия е изключително важно понятие в Интернет на нещата. Повечето IoT възли трябва да се захранват от батерии. Само чрез правилно измерване на консумацията на енергия на безжичния модул можем да преценим точно колко батерия съм