Obsah:
- Zásoby
- Krok 1: 1. Nastavte Atecc608a
- Krok 2: 2. Návrh obvodu (hlavný a podriadený)
- Krok 3: 3. Kód (Slave a Master)
- Krok 4: 4. Choďte ďalej
- Krok 5: Záver
Video: Bezdrôtová šifrovaná komunikácia Arduino: 5 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
Ahojte všetci, V tomto druhom článku vám vysvetlím, ako používať čip Atecc608a na zabezpečenie vašej bezdrôtovej komunikácie. Na tento účel použijem NRF24L01+ pre bezdrôtovú časť a Arduino UNO.
Mikročip ATECC608A bol navrhnutý spoločnosťou MicroChip a dostal viacero bezpečnostných nástrojov. Tento čip môže napríklad uchovávať kľúče ECC, AES (pre AES 128) a SHA2 Hash.
Článok: NRF24L01 + Arduino UNO + ATECC608A
Počas komunikácie medzi dvoma objektmi IoT môže existovať viacero útokov: muž mierneho typu, kópia informácií a ďalšie.. Moja predstava je teda veľmi jednoduchá:
- Využitie šifrovaných údajov medzi dvoma alebo viacerými objektmi IoT.
- Nízke náklady na zásoby
- Môže pracovať s Arduino UNO
V mojom prípade používam
- Atecc608a na uloženie môjho kľúča AES a na šifrovanie/dešifrovanie mojich údajov.
- Arduino Uno ako mikrokontrolér
- NRF24L01 na odoslanie mojich údajov
Pri tomto projekte musíte vykonať tieto kroky:
- Nastavte čip ATECC608A
- Vykonajte obvod (hlavný uzol a podradený uzol)
- Časť kódu
- Pokračuj !
K prvým krokom „Nastavenie čipu ATECC608A“som napísal ďalší článok, ktorý vysvetľuje každý krok v poradí. Odkaz je tu:
Teraz začnite!
Zásoby
Na tento projekt potrebujete:
- 2 Arduino UNO alebo Arduino NANO alebo Arduino Mega
- Nejaký drôt
- 2 Atecc608a (každý stál menej ako 0,60 $)
- 2 NRF24L01+
- 2 kondenzátor (10 μF)
- Breadboards
Odkaz na môj článok, ktorý vysvetľuje, ako nastaviť čip ATECC608A -> Ako nastaviť Atecc608a
Krok 1: 1. Nastavte Atecc608a
Nebudem podrobne popisovať každý krok, ktorý je potrebné dodržať pri nastavovaní ATECC608A, pretože som napísal celý článok, ktorý vysvetľuje všetky kroky, ako to urobiť. Ak ho chcete nastaviť, musíte postupovať podľa „Krok 4“tohto článku s názvom „2. Konfigurácia čipu (Atecc608a)“
Odkaz je: Ako nastaviť ATECC608A
Tiež musíte vložiť rovnakú konfiguráciu pre Atecc608a, nadradenú a podradenú stranu, inak nebudete môcť dešifrovať svoje údaje
Pozor:
Ak chcete nastaviť tento čip, musíte v poriadku vykonať všetky kroky vyššie uvedeného článku. Ak chýba jeden krok alebo čip nie je zablokovaný, tento projekt by ste nemohli vykonať
Zvyšok:
K tomu je potrebné dodržať nasledujúci krok:
- Vytvorte konfiguračnú šablónu
- Napíšte túto šablónu na čip
- Uzamknite konfiguračnú zónu
- Napíšte svoj AES kľúč (128 bitov) do slotu
- Uzamknite dátovú zónu
Krok 2: 2. Návrh obvodu (hlavný a podriadený)
V tomto projekte budete mať hlavný uzol a podradený uzol.
Hlavný uzol vytlačí údaje odoslané podriadeným uzlom ako čisté. Bude vyžadovať údaje z podradeného uzla každých X -krát.
Podradený uzol bude počúvať „sieť“a keď prijme „Požiadať o údaje“, vygeneruje ich, zašifruje a odošle do hlavného uzla.
Okruh Master a Slave je na oboch stranách rovnaký:
- Jedno arduino Nano
- Jeden ATECC608A
- Jeden NRF24L01
K tomuto kroku som pripojil obvod (porovnaj obrázok vyššie).
Pre ATECC608A k Arduino UNO je to 8 pinov soic. Vyššie som pridal „pohľad zhora“:
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Pre NRF24L01 pre 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) -> iba pre podradený uzol, nepoužíva sa v režime Master
Prečo používať pin IRQ na NRF24L01
PIN IRQ je veľmi užitočný. Tento pin umožňuje povedať (LOW), keď je NRF24L01 prijatý paket, takže k tomuto pinu môžeme pripojiť prerušenie, aby sa prebudil podradený uzol.
Krok 3: 3. Kód (Slave a Master)
Slave uzol
Na podradený uzol používam úsporu energie, pretože nepotrebuje neustále počúvať.
Ako to funguje: podradený uzol počúva a čaká na prijatie paketu „Wake UP“. Tento paket odosiela hlavný uzol na vyžiadanie údajov od zariadenia slave.
V mojom prípade používam pole dvoch int:
// Paket prebudenia
const int wake_packet [2] = {20, 02};
Ak môj uzol dostane paket,
- prebuďte sa, prečítajte si tento paket, ak je paket „Wake UP“,
- generuje údaje,
- zašifrovať údaje,
- pošlite údaje kapitánovi, počkajte na paket ACK,
- spať.
Na šifrovanie AES používam kľúč v slote číslo 9.
Toto je môj kód pre uzol Slave
#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"
#include "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#include "Wire.h"
// knižnica ATECC608A
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#define ID_NODE 255
#define AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
Stav ATCA_STATUS;
Rádio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / brief Funkcia sa vykoná, keď je nastavené prerušenie (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& data, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17,6; plavákový hukot = 16,4;
uint8_t údaje [16];
uint8_t cypherdata [16];
// Vytvorením reťazca nastavíte celú moju hodnotu
// Každá hodnota je oddelená znakom "|" a „$“znamená koniec údajov // UPOZORNENIE: Musí mať dĺžku menšiu ako 11 reťazcov tmp_str_data = String (ID_NODE) + "|" + Reťazec (teplota, 1) + "|" + Reťazec (hukot, 1) + "$"; // veľkosť 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (údaje, sizeof (údaje));
// Zašifrujte údaje
ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);
// vygenerovanie UUID na základe troch prvých čísel = uzol ID
String uuid = String (ID_NODE) + String (rand); // Veľkosť 8
uint8_t tmp_uuid [8];
uint8_t data_to_send [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)); // Prestaňte počúvať radio.stopListening ();
bool rslt;
// Odoslanie údajov rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Začnite počúvať radio.startListening (); if (rslt) {// Režim ukončenia a spánku Serial.println (F („Hotovo“)); }}}}}
neplatné nastavenie ()
{Serial.begin (9600);
// Spustenie konfigurátora knižnice
cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikácie -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (predvolená hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oneskorenie prebudenia (1 500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setObjednávky (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Pripojenie prerušenia k pinu 3 // Upravte 1 o O, ak chcete prerušenie k pinu 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
prázdna slučka ()
{ // Netreba }
Hlavný uzol
Hlavný uzol sa prebúdza každých 8 sekúnd, aby vyžiadal údaje z podradeného uzla
Ako to funguje: Hlavný uzol pošle paketu „WakeUP“do podriadeného zariadenia a po čakaní na odpoveď podriadeného zariadenia s údajmi.
V mojom prípade používam pole dvoch int:
// Paket prebudenia
const int wake_packet [2] = {20, 02};
Ak uzol slave odošle paket ACK potom, čo master odoslal paket WakeUp:
- Master nastavený v režime počúvania a čakajte na komunikáciu
- Ak komunikácia
- Extrahujte 8 prvých bajtov, vyrabujte tri prvé bajty z 8 bajtov, ak ide o uzol ID
- Extrahujte 16 bajtov šifry
- Dešifrujte údaje
- Vytlačte údaje v sérii
- Spánkový režim
Na šifrovanie AES používam kľúč v slote číslo 9.
Toto je môj kód pre hlavný uzol
#include "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A library #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; Stav ATCA_STATUS; Rádio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Paket Wake UP const int wake_packet [2] = {20, 02}; // prerušenie strážneho psa ISR (WDT_vect) {wdt_disable (); // vypnúť strážneho psa} void sleepmode () {// vypnúť ADC ADCSRA = 0; // vymazanie rôznych vlajok "reset" MCUSR = 0; // povoliť zmeny, zakázať reset WDTCSR = bit (WDCE) | bit (WDE); // nastavenie režimu prerušenia a interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // nastavenie WDIE a oneskorenie 8 sekúnd wdt_reset (); // reset strážneho psa set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // časovaná sekvencia nasleduje sleep_enable (); // vypnutie vypínania v softvéri MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); prerušenia (); // garantuje vykonanie ďalšej inštrukcie sleep_cpu (); // preventívne zrušte spánok sleep_disable (); } neplatné nastavenie () {Serial.begin (9600); // Spustenie konfigurátora knižnice cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikácie -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (predvolená hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oneskorenie prebudenia (1 500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setObjednávky (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Odoslanie údajov rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Začnite počúvať radio.startListening (); while (radio.available ()) {uint8_t odpoveď [32]; radio.read (& odpoveď, sizeof (odpoveď)); uint8_t node_id [3]; uint8_t šifra [16]; memcpy (node_id, odpoveď, 3); memcpy (šifra, odpoveď + 3, 16); if ((int) node_id == ID_NODE) {uint8_t výstup [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Dešifrované údaje:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack not receive for Wakup Packet"); } // Režim spánku 8 sekúnd režim spánku (); }
Ak máte otázku, som tu, aby som vám odpovedal
Krok 4: 4. Choďte ďalej
Tento príklad je jednoduchý, takže môžete tento projekt vylepšiť
Vylepšenia:
- AES 128 je základný a môžete použiť aj iný algoritmus AES ako AES CBC, aby bol bezpečnejší.
- Zmeňte bezdrôtový modul (NRF24L01 je obmedzený užitočným zaťažením 23 bytov)
- …
Ak vidíte zlepšenie, vysvetlite to v diskusnej oblasti
Krok 5: Záver
Dúfam, že tento článok bude pre vás užitočný. Ospravedlňujeme sa, ak som sa vo svojom texte zmýlil, ale angličtina nie je môj hlavný jazyk a hovorím lepšie, ako píšem.
Ďakujem, že ste si všetko prečítali.
Uži si to.
Odporúča:
Bezdrôtová komunikácia SmartHome: Extrémne základy MQTT: 3 kroky
Bezdrôtová komunikácia SmartHome: Extrémne základy MQTT: Základy MQTT: ** Budem robiť sériu domácej automatizácie, prejdem krokmi, ktoré som urobil, aby som sa v budúcnosti dozvedel všetko, čo som urobil. Tento návod je východiskovým bodom pre nastavenie MQTT na použitie v mojich budúcich pokynoch. Ako
Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: 15 krokov
Bezdrôtová komunikácia LoRa 3 km až 8 km s nízkymi nákladmi na zariadenie E32 (sx1278/sx1276) pre Arduino, Esp8266 alebo Esp32: Vytváram knižnicu na správu EBYTE E32 na základe série zariadení LoRa Semtech, veľmi výkonného, jednoduchého a lacného zariadenia. Verzia 3 km tu, verzia 8 km tu Môžu pracovať na vzdialenosť 3 000 až 8 000 m a majú mnoho funkcií
Bezdrôtová komunikácia Arduino na Arduino s dlhým dosahom 1,8 km s HC-12 .: 6 krokov (s obrázkami)
Bezdrôtová komunikácia s dlhým dosahom, 1,8 km, Arduino až Arduino s HC-12 .: V tomto návode sa naučíte, ako komunikovať medzi Arduinosom na dlhé vzdialenosti až 1,8 km pod holým nebom. HC-12 je bezdrôtový sériový port komunikačný modul, ktorý je veľmi užitočný, extrémne výkonný a ľahko sa používa. Najprv odídeš
Bezdrôtová komunikácia pomocou transceiverového modulu NRF24L01 pre projekty založené na Arduino: 5 krokov (s obrázkami)
Bezdrôtová komunikácia pomocou transceiverového modulu NRF24L01 pre projekty založené na Arduine: Toto je môj druhý návod s pokynmi k robotom a mikroovládačom. Je skutočne úžasné vidieť svojho robota nažive a pracovať podľa očakávania a verte mi, že to bude zábavnejšie, ak budete svojho robota alebo iné veci ovládať rýchlo a
Bezdrôtová komunikácia pomocou lacných RF modulov 433 MHz a obrazových mikrokontrolérov. Časť 2: 4 kroky (s obrázkami)
Bezdrôtová komunikácia pomocou lacných RF modulov 433 MHz a obrazových mikrokontrolérov. Časť 2: V prvej časti tohto návodu som predviedol, ako naprogramovať PIC12F1822 pomocou kompilátora MPLAB IDE a XC8 tak, aby sa jednoduchý reťazec odoslal bezdrôtovo pomocou lacných modulov TX/RX 433 MHz. Modul prijímača bol pripojený cez USB k UART TTL káblová reklama