Indholdsfortegnelse:

Trådløs krypteret kommunikation Arduino: 5 trin
Trådløs krypteret kommunikation Arduino: 5 trin

Video: Trådløs krypteret kommunikation Arduino: 5 trin

Video: Trådløs krypteret kommunikation Arduino: 5 trin
Video: ESP8266 Беспроводной ЧМИ Nextion || Внешний ПЛК Arduino 2024, November
Anonim
Trådløs krypteret kommunikation Arduino
Trådløs krypteret kommunikation Arduino

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:

  1. Udnyttelse af krypterede data mellem to eller flere IoT -objekter.
  2. Lavprisudstyr
  3. 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:

  1. Opsæt chippen ATECC608A
  2. Lav kredsløbet (Master Node og Slave Node)
  3. Kode del
  4. 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

1. Konfigurer Atecc608a
1. Konfigurer Atecc608a
1. Konfigurer Atecc608a
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)

2. Design af kredsløbet (Master og Slave)
2. Design af kredsløbet (Master og Slave)
2. Design af kredsløbet (Master og Slave)
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)

3. koden (Slave og Master)
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,

  1. den vågner, læs denne pakke, hvis pakken er en "Wake UP",
  2. det genererer data,
  3. kryptere data,
  4. send dataene til masteren, vent en ACK -pakke,
  5. 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:

  1. Master opsat i lytttilstand, og vent på en meddelelse
  2. Hvis kommunikation
  3. Udtræk de 8 første byte, plyndre de tre første byte af de 8 bytes, hvis dette er ID -noden
  4. Udtræk 16 byte cyper
  5. Dekrypter dataene
  6. Udskriv dataene i serie
  7. 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: