Sadržaj:

Bežična šifrirana komunikacija Arduino: 5 koraka
Bežična šifrirana komunikacija Arduino: 5 koraka

Video: Bežična šifrirana komunikacija Arduino: 5 koraka

Video: Bežična šifrirana komunikacija Arduino: 5 koraka
Video: ESP8266 ESP01 WI-FI-UART | Программирование LDmicro-Roboremo 2024, Studeni
Anonim
Bežična šifrirana komunikacija Arduino
Bežična šifrirana komunikacija Arduino

Pozdrav svima, U ovom drugom članku objasnit ću vam kako koristiti čip Atecc608a za zaštitu svoje bežične komunikacije. Za to ću koristiti NRF24L01+ za bežični dio i Arduino UNO.

Mikro čip ATECC608A dizajnirao je MicroChip i ima više sigurnosnih alata. Na primjer, ovaj čip može pohraniti ECC ključeve, AES ključeve (za AES 128) i SHA2 Hash.

Članak: NRF24L01 + Arduino UNO + ATECC608A

Tijekom komunikacije između dva IoT objekta može postojati više napada: Blagi čovjek, Kopija informacija i više.. Dakle, moja ideja je vrlo jednostavna:

  1. Korištenje šifriranih podataka između dva ili više IoT objekata.
  2. Povoljne zalihe
  3. Može raditi s Arduino UNO

U mom slučaju koristim

  • Atecc608a za spremanje mog AES ključa i za šifriranje/dešifriranje mojih podataka.
  • Arduino Uno kao mikrokontroler
  • NRF24L01 za slanje mojih podataka

Za ovaj projekt morate slijediti ove korake:

  1. Postavite čip ATECC608A
  2. Učinite krug (glavni čvor i podređeni čvor)
  3. Kodni dio
  4. Idi dalje !

Za prve korake "Postavljanje čipa ATECC608A" napisao sam drugi članak koji redom objašnjava svaki korak. Link je ovdje:

Sada počni!

Pribor

Za ovaj projekt potrebno vam je:

  • 2 Arduino UNO ili Arduino NANO ili Arduino Mega
  • Neka žica
  • 2 Atecc608a (svaki košta manje od 0,60 USD)
  • 2 NRF24L01+
  • 2 kondenzatora (10 μF)
  • Oglasne ploče

Link na moj članak koji objašnjava kako postaviti čip ATECC608A -> Kako postaviti Atecc608a

Korak 1: 1. Postavite Atecc608a

1. Postavite Atecc608a
1. Postavite Atecc608a
1. Postavite Atecc608a
1. Postavite Atecc608a

Neću opisivati svaki korak koji slijedi za postavljanje ATECC608A jer sam napisao cijeli članak koji objašnjava sve korake za to. Da biste ga postavili, morate slijediti "Korak 4" ovog članka pod nazivom "2. Konfiguracija čipa (Atecc608a)"

Veza je: Kako postaviti ATECC608A

Također, morate postaviti istu konfiguraciju za Atecc608a, master i slave stranu, inače nećete moći dešifrirati svoje podatke

Upozorenje:

Da biste postavili ovaj čip, morate slijediti sve korake iz gornjeg članka. Ako jedan korak nedostaje ili čip nije zaključan, ne biste mogli izvesti ovaj projekt

Ostatak:

Da biste to učinili, učinite sljedeće:

  • Izradite predložak konfiguracije
  • Napišite ovaj predložak na čip
  • Zaključajte Config Zone
  • Upišite svoj AES ključ (128 bita) u utor
  • Zaključajte podatkovnu zonu

Korak 2: 2. Dizajn kruga (glavni i podređeni)

2. Dizajn kruga (master i slave)
2. Dizajn kruga (master i slave)
2. Dizajn kruga (master i slave)
2. Dizajn kruga (master i slave)

U ovom projektu imat ćete glavni čvor i podređeni čvor.

Glavni čvor ispisat će podatke poslane od podređenog čvora u čistom obliku. Svaki će put X zahtijevati podatke od podređenog čvora.

Podređeni čvor poslušat će "mrežu" i kada primi "Zahtjev za podacima", generirat će je, šifrirati i poslati na glavni čvor.

Za obje strane, master i slave sklop je isti:

  • Jedan arduino Nano
  • Jedan ATECC608A
  • Jedan NRF24L01

Priključio sam krug na ovaj korak (cf slika gore).

Za ATECC608A na Arduino UNO ovo je 8 -polni soic. Gore sam dodao "pogled odozgo":

  • ARDUINO 3.3V -> PIN 8 (Atecc608a)
  • ARDUINO GND -> PIN 4 (Atecc608a)
  • ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  • ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Za NRF24L01 za 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) -> samo za podređeni čvor, ne koristi se u glavnom načinu

Zašto koristiti IRQ pin NRF24L01

IRQ pin je vrlo koristan, ovaj pin omogućuje reći (LOW) kada NRF24L01 primi paket, tako da ovom pin -u možemo priključiti Interrupt da probudimo slave čvor.

Korak 3: 3. Kôd (slave i master)

3. Kodeks (slave i master)
3. Kodeks (slave i master)

Podređeni čvor

Koristim uštedu energije za podređeni čvor jer ne mora stalno slušati.

Kako to radi: slave čvor sluša i čeka da primi "Wake UP paket". Ovaj paket šalje čvor Master da traži podatke od podređenog uređaja.

U mom slučaju koristim niz od dva int:

// Wake UP paket

const int wake_packet [2] = {20, 02};

Ako moj čvor primi paket,

  1. probudi se, pročitaj ovaj paket, ako je paket "Wake UP",
  2. generira podatke,
  3. šifriranje podataka,
  4. pošaljite podatke masteru, pričekajte ACK paket,
  5. spavati.

Za AES enkripciju koristim ključ u utoru broj 9.

Ovo je moj kôd za čvor Slave

#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"

#include "SPI.h"

#include "nRF24L01.h" #include "RF24.h"

#include "Wire.h"

// Knjiž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;

ATCA_STATUS status;

Radio RF24 (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / brief Funkcija se izvršava kada je prekid postavljen (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.čitaj (& podaci, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17,6; brujanje plovka = 16,4;

uint8_t podaci [16];

uint8_t cypherdata [16];

// Napravite niz za postavljanje svih mojih vrijednosti

// Svaka vrijednost odvojena je s "|" i "$" znači kraj podataka // UPOZORENJE: Mora biti manje od 11 duljine String tmp_str_data = String (ID_NODE) + "|" + Niz (temp, 1) + "|" + String (pjevušenje, 1) + "$"; // veličina 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (podaci, veličina (podaci));

// Šifriranje podataka

ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);

// generiranje UUID -a na temelju prva tri čvora number = ID

String uuid = String (ID_NODE) + String (rand); // Veličina 8

uint8_t tmp_uuid [8];

uint8_t podaci_za_poslanje [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)); // Prestanite slušati radio.stopListening ();

bool rslt;

// Slanje podataka rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Počni slušati radio.startListening (); if (rslt) {// Način završetka i mirovanja Serial.println (F ("Gotovo")); }}}}}

void setup ()

{Serial.begin (9600);

// Pokretanje tvorca za knjižnicu

cfg.iface_type = ATCA_I2C_IFACE; // Vrsta komunikacije -> I2C način cfg.devtype = ATECC608A; // Vrsta čipa cfg.atcai2c.slave_address = 0XC0; // I2C adresa (zadana vrijednost) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Odgoda buđenja (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); // Priključite prekid na pin 3 // Izmijenite 1 s O ako želite prekid na pin 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

void loop ()

{ // Nema potrebe }

Glavni čvor

Glavni čvor budi se svakih 8 sekundi kako bi zatražio podatke od podređenog čvora

Kako to radi: Glavni čvor šalje "WakeUP" paket podređenom uređaju i nakon čekanja daje odgovor slave s podacima.

U mom slučaju koristim niz od dva int:

// Wake UP paket

const int wake_packet [2] = {20, 02};

Ako slave čvor šalje ACK paket nakon što je master poslao WakeUp paket:

  1. Master se postavi u način slušanja i pričekajte komunikaciju
  2. Ako komunikacija
  3. Izdvojite prvi 8 bajt, otkupite prva tri bajta od 8 bajtova, ako je ovo ID čvor
  4. Izdvojite 16 bajta šifre
  5. Dešifrirajte podatke
  6. Ispišite podatke u serijskom broju
  7. Stanje mirovanja

Za AES enkripciju koristim ključ u utoru broj 9.

Ovo je moj kod za čvor Master

#uključuje "Arduino.h"

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A knjižnica #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; Radio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP paket const int wake_packet [2] = {20, 02}; // nadzorni prekidač ISR (WDT_vect) {wdt_disable (); // onemogućiti nadzornika} void sleepmode () {// onemogućiti ADC ADCSRA = 0; // briše razne zastavice za "reset" MCUSR = 0; // dopuštamo promjene, onemogućujemo reset WDTCSR = bit (WDCE) | bit (WDE); // postavljanje načina prekida i intervala WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // postavlja WDIE i 8 sekundi odgode wdt_reset (); // resetiranje čuvara set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // vremenski slijed slijedi sleep_enable (); // isključiti omogućavanje smeđeg ispisa u softveru MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); prekida (); // jamči izvršenje sljedeće naredbe sleep_cpu (); // kao mjera opreza otkazati spavanje sleep_disable (); } void setup () {Serial.begin (9600); // Pokretanje tvorca za knjižnicu cfg.iface_type = ATCA_I2C_IFACE; // Vrsta komunikacije -> I2C način cfg.devtype = ATECC608A; // Vrsta čipa cfg.atcai2c.slave_address = 0XC0; // I2C adresa (zadana vrijednost) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Odgoda buđenja (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; // Slanje podataka rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Počni slušati radio.startListening (); while (radio.available ()) {uint8_t odgovor [32]; radio.read (& answer, sizeof (answer)); uint8_t čvor_id [3]; uint8_t šifra [16]; memcpy (node_id, odgovor, 3); memcpy (šifra, odgovor + 3, 16); if ((int) node_id == ID_NODE) {uint8_t izlaz [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, šifra, 16, izlaz, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Dešifrirani podaci:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack ne prima za paket za preuzimanje"); } // Način mirovanja 8 sekundi sleepmode (); }

Ako imate pitanje, tu sam da vam odgovorim

Korak 4: 4. Idite dalje

Ovaj primjer je jednostavan pa možete poboljšati ovaj projekt

Poboljšanja:

  • AES 128 je osnovni i možete koristiti drugi algoritam AES -a kao AES CBC kako biste bili sigurniji.
  • Promijenite bežični modul (NRF24L01 je ograničen korisnim opterećenjem od 23 bajta)

Ako vidite poboljšanje, objasnite to u području za raspravu

Korak 5: Zaključak

Nadam se da će vam ovaj članak biti od koristi. Oprostite ako sam pogriješio u tekstu, ali engleski mi nije glavni jezik i govorim bolje nego što pišem.

Hvala što ste sve pročitali.

Uživaj.

Preporučeni: