Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: 1. Konfigurer Atecc608a
- Trin 2: 2. Design af kredsløbet (Master og Slave)
- Trin 3: 3. Koden (Slave og Master)
- Trin 4: 4. Gå videre
- Trin 5: Konklusion
Video: Trådløs krypteret kommunikation Arduino: 5 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:26
Hej allesammen, I denne anden artikel vil jeg forklare dig, hvordan du bruger chippen Atecc608a til at sikre din trådløse kommunikation. Til dette vil jeg bruge NRF24L01+ til den trådløse del og Arduino UNO.
Mikrochippen ATECC608A er designet af MicroChip og har flere sikkerhedsværktøjer. For eksempel kan denne chip gemme ECC -taster, AES -taster (for AES 128) og SHA2 Hash.
Artiklen: NRF24L01 + Arduino UNO + ATECC608A
Under en kommunikation mellem to IoT -objekter kan der være flere angreb: Man Of the mild, kopi af oplysninger og mere.. Så min idé er meget enkel:
- Udnyttelse af krypterede data mellem to eller flere IoT -objekter.
- Lavprisudstyr
- Kan arbejde med en Arduino UNO
I mit tilfælde bruger jeg
- Atecc608a for at gemme min AES -nøgle og for at kryptere/dekryptere mine data.
- Arduino Uno som mikrokontroller
- NRF24L01 til at sende mine data
Du skal følge disse trin for dette projekt:
- Opsæt chippen ATECC608A
- Lav kredsløbet (Master Node og Slave Node)
- Kode del
- Gå længere !
Til de første trin "Konfigurer chippen ATECC608A" skrev jeg en anden artikel, der forklarer hvert trin i rækkefølge. Linket er her:
Start nu!
Forbrugsvarer
Til dette projekt har du brug for:
- 2 Arduino UNO eller Arduino NANO eller Arduino Mega
- Noget ledning
- 2 Atecc608a (hver koster mindre end 0,60 $)
- 2 NRF24L01+
- 2 kondensator (10 μF)
- Brødbrætter
Link til min artikel, der forklarer hvordan opsætning af chippen ATECC608A -> Sådan opsættes Atecc608a
Trin 1: 1. Konfigurer Atecc608a
Jeg vil ikke beskrive hvert trin, der skal følges for at oprette en ATECC608A, fordi jeg skrev en fuld artikel, der forklarer alle trin for at gøre det. For at konfigurere det skal du følge "Trin 4" i denne artikel kaldet "2. Konfiguration af chippen (Atecc608a)"
Linket er: Sådan opsættes en ATECC608A
Du skal også sætte den samme konfiguration til Atecc608a, hovedsiden og slave -siden, ellers kan du ikke dekryptere dine data
Advarsel:
For at konfigurere denne chip skal du følge hvert trin i artiklen ovenfor i rækkefølge. Hvis et trin mangler, eller chippen ikke er låst, kan du ikke udføre dette projekt
Resten:
Trin for at følge dette:
- Opret en konfigurationsskabelon
- Skriv denne skabelon til chippen
- Lås konfigurationszonen
- Skriv din AES -nøgle (128 bits) i en slot
- Lås datazonen
Trin 2: 2. Design af kredsløbet (Master og Slave)
I dette projekt vil du have en Master Node og en Slave Node.
Hovednoden udskriver de data, der sendes af slaveknuden, klart. Det vil anmode om data fra slaveknuden hver X gang.
Slaveknuden lytter til "netværket", og når den modtager en "Anmodningsdata", genererer den den, krypterer den og sender den til hovednoden.
For begge sider, master og slave er kredsløbet det samme:
- Én arduino Nano
- Én ATECC608A
- Én NRF24L01
Jeg vedhæftede kredsløbet til dette trin (jf. Billedet ovenfor).
For ATECC608A til Arduino UNO er dette en soic 8 -pins. Jeg tilføjede "ovenfra" ovenfor:
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Til NRF24L01 til 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) -> kun til Slave -knude, ikke brugt i Master -tilstand
Hvorfor bruge IRQ -stiften på NRF24L01
IRQ -pin er meget nyttig, denne pin gør det muligt at sige (LOW), når en pakke modtages af NRF24L01, så vi kan vedhæfte en Interrupt til denne pin for at vække slaveknuden.
Trin 3: 3. Koden (Slave og Master)
Slave Node
Jeg bruger strømbesparelse til slaveknuden, fordi den ikke behøver at lytte hele tiden.
Sådan fungerer det: slaveknuden lytter og venter på at modtage en "Wake UP -pakke". Denne pakke sendes af Master -noden for at bede om data fra slaven.
I mit tilfælde bruger jeg en matrix med to int:
// Wake UP -pakke
const int wake_packet [2] = {20, 02};
Hvis min node modtager en pakke,
- den vågner, læs denne pakke, hvis pakken er en "Wake UP",
- det genererer data,
- kryptere data,
- send dataene til masteren, vent en ACK -pakke,
- søvn.
Til AES -kryptering bruger jeg en nøgle i slot nummer 9.
Dette er min kode for Slave -noden
#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"
#inkluder "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#inkluder "Wire.h"
// ATECC608A bibliotek
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#define ID_NODE 255
#define AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
ATCA_STATUS status;
RF24 radio (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / brief Funktion udført, når afbrydelsen er indstillet (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& data, 32); hvis (data [0] == 20 && data [1] == 02) {float temp = 17,6; flyde brummen = 16,4;
uint8_t data [16];
uint8_t cypherdata [16];
// Byg en streng for at indstille al min værdi
// Hver værdi adskilles med et "|" og "$" betyder slutningen af data // ADVARSEL: Skal være mindre end 11 længde String tmp_str_data = String (ID_NODE) + "|" + String (temp, 1) + "|" + String (brum, 1) + "$"; // størrelse på 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (data, sizeof (data));
// Krypter dataene
ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); hvis (status == ATCA_SUCCESS) {lang rand = tilfældig ((lang) 10000, (lang) 99999);
// generer et UUID baseret på de tre første tal = ID -knudepunkt
String uuid = String (ID_NODE) + String (rand); // Størrelse på 8
uint8_t tmp_uuid [8];
uint8_t data_til_send [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (data_til_send, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_til_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Stop med at lytte til radio.stopListening ();
bool rslt;
// Send data rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Start med at lytte radio.startListening (); hvis (rslt) {// Afslut og dvaletilstand Serial.println (F ("Udført")); }}}}}
ugyldig opsætning ()
{Serial.begin (9600);
// Start konstruktøren for biblioteket
cfg.iface_type = ATCA_I2C_IFACE; // Kommunikationstype -> I2C -tilstand cfg.devtype = ATECC608A; // Type chip cfg.atcai2c.slave_address = 0XC0; // I2C -adresse (standardværdi) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Forsinkelse af vågning (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); // Vedhæft afbrydelse til stiften 3 // Ændr 1 med O, hvis du vil have afbrydelsen til stiften 2 // FALLING MODE = Pin ved LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
hulrum ()
{// Intet behov}
Master Node
Hovednoden vågner hvert 8. sekund for at bede om data fra slaveknudepunktet
Sådan fungerer det: Hovednoden sender en "WakeUP" -pakke til slaven og efter ventet svar fra slaven med data.
I mit tilfælde bruger jeg en matrix med to int:
// Wake UP -pakke
const int wake_packet [2] = {20, 02};
Hvis slaveknuden sender en ACK -pakke, efter at masteren har sendt en WakeUp -pakke:
- Master opsat i lytttilstand, og vent på en meddelelse
- Hvis kommunikation
- Udtræk de 8 første byte, plyndre de tre første byte af de 8 bytes, hvis dette er ID -noden
- Udtræk 16 byte cyper
- Dekrypter dataene
- Udskriv dataene i serie
- Sove mode
Til AES -kryptering bruger jeg en nøgle i slot nummer 9.
Dette er min kode til Master -noden
#inkluderer "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; ATCA_STATUS status; RF24 radio (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP -pakke const int wake_packet [2] = {20, 02}; // vagthund afbryder ISR (WDT_vect) {wdt_disable (); // deaktiver vagthund} void sleepmode () {// deaktiver ADC ADCSRA = 0; // ryd forskellige "reset" -flag MCUSR = 0; // tillad ændringer, deaktiver nulstilling WDTCSR = bit (WDCE) | bit (WDE); // indstil afbrydelsestilstand og et interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // indstil WDIE, og 8 sekunders forsinkelse wdt_reset (); // nulstil vagtbogens sæt_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // timet sekvens følger sleep_enable (); // sluk for brown -out aktivering i software MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); afbryder (); // garanterer næste instruktion udført sleep_cpu (); // annuller søvn som en sikkerhedsforanstaltning sleep_disable (); } ugyldig opsætning () {Serial.begin (9600); // Start konstruktøren for biblioteket cfg.iface_type = ATCA_I2C_IFACE; // Kommunikationstype -> I2C -tilstand cfg.devtype = ATECC608A; // Type chip cfg.atcai2c.slave_address = 0XC0; // I2C -adresse (standardværdi) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Forsinkelse af vågning (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; // Send data rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Start Listening radio.startListening (); mens (radio.available ()) {uint8_t svar [32]; radio.read (& svar, sizeof (svar)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, svar, 3); memcpy (cypher, svar + 3, 16); hvis ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Dekrypterede data:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Modtag ikke for Wakup -pakke"); } // Dvaletilstand 8 sekunders sleepmode (); }
Hvis du har spørgsmål, er jeg her for at besvare det
Trin 4: 4. Gå videre
Dette eksempel er enkelt, så du kan forbedre dette projekt
Forbedringer:
- AES 128 er grundlæggende, og du kan bruge en anden algoritme til AES som AES CBC for at være mere sikker.
- Skift det trådløse modul (NRF24L01 er begrænset af en nyttelast på 23 Bytes)
- …
Hvis du kan se forbedringer, skal du forklare det på diskussionsområdet
Trin 5: Konklusion
Jeg håber, at denne artikel vil være nyttig for dig. Beklager, hvis jeg tog fejl i min tekst, men engelsk er ikke mit hovedsprog, og jeg taler bedre, end jeg skriver.
Tak fordi du læste alt.
Nyd det.
Anbefalede:
LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin
LoRa 3 til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: Jeg opretter et bibliotek til at styre EBYTE E32 baseret på Semtech -serien af LoRa -enheder, meget kraftfuld, enkel og billig enhed.Du kan finde 3Km version her, 8Km version herDe kan arbejde over en afstand på 3000m til 8000m, og de har en masse funktioner og
Lang rækkevidde, 1,8 km, Arduino til Arduino trådløs kommunikation med HC-12 .: 6 trin (med billeder)
Lang rækkevidde, 1,8 km, Arduino til Arduino Trådløs kommunikation med HC-12 .: I denne instruktør vil du lære at kommunikere mellem Arduinos over en lang afstand op til 1,8 km i det fri. HC-12 er en trådløs seriel port kommunikationsmodul, der er meget nyttigt, ekstremt kraftfuldt og let at bruge. Først vil du lære
Trådløs kommunikation ved hjælp af NRF24L01 -transceivermodul til Arduino -baserede projekter: 5 trin (med billeder)
Trådløs kommunikation ved hjælp af NRF24L01 Transceiver-modul til Arduino-baserede projekter: Dette er min anden instruerbare vejledning om robotter og mikro-controllere. Det er virkelig fantastisk at se din robot i live og fungere som forventet, og tro mig, det vil være sjovere, hvis du styrer din robot eller andre ting trådløst med hurtig og
Krypteret filbevægelse: 7 trin
Krypteret filbevægelse: For et år siden var jeg en del af et projekt. Vi var nødt til at flytte nogle følsomme oplysninger over hele landet. Jeg vil gå over baggrunden for hvorfor, spring gerne til trin 1. Baggrunden: Mit team blev kaldt ind med kort varsel for at gendanne en computer fra en t
Lav en skjult og krypteret harddiskpartition gratis: 4 trin
Lav en skjult og krypteret harddiskpartition gratis: Sådan laves en partition, f.eks. C: eller D: -drev, der allerede er på en ny computer, men den er skjult for alle (vises ikke på min computer eller noget lignende) og har kryptering i regeringsklasse, og alt gratis. Det vil kræve