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: Обзор и конфигурация модуля EBYTE LoRa 2024, Novembar
Anonim
Bežična šifrirana komunikacija Arduino
Bežična šifrirana komunikacija Arduino

Zdravo svima, U ovom drugom članku ću vam objasniti 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 je dizajnirao 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

Tokom 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. Potrošni materijal
  3. Može raditi sa 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 deo
  4. Idi dalje !

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

Sada počni!

Supplies

Za ovaj projekat 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)
  • Breadboards

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 detaljno opisati 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:

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

Korak 2: 2. Dizajn kola (master i slave)

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

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

Glavni čvor će ispisati podatke poslane od podređenog čvora u čistom obliku. On će svaki put X zahtijevati podatke od podređenog čvora.

Podređeni čvor će slušati "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 kolo na ovaj korak (cf slika gore).

Za ATECC608A do Arduino UNO -a, ovo je soicni 8 pinski. Dodao sam "pogled odozgo" gore:

  • 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 Slave čvor, ne koristi se u Master načinu rada

Zašto koristiti IRQ pin NRF24L01

IRQ pin je vrlo koristan, ovaj pin omogućava da kaže (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. kod (slave i master)
3. kod (slave i master)

Slave Node

Koristim uštedu energije za slave čvor jer ne mora stalno slušati.

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

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. spavaj.

Za AES šifriranje koristim ključ u utoru broj 9.

Ovo je moj kod za slave čvor

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

#include "SPI.h"

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

#include "Wire.h"

// ATECC608A biblioteka

#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.read (& podaci, 32); if (podaci [0] == 20 && podaci [1] == 02) {float temp = 17,6; plivajuće brujanje = 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 dužine String tmp_str_data = String (ID_NODE) + "|" + Niz (temp, 1) + "|" + String (hum, 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, podaci, veličina (podaci), šifrirani podaci, 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 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)); // Prestanite slušati radio.stopListening ();

bool rslt;

// Slanje podataka rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Pokretanje slušanja radio.startListening (); if (rslt) {// Završni i stanje mirovanja Serial.println (F ("Gotovo")); }}}}}

void setup ()

{Serial.begin (9600);

// Pokretanje konstuktora za biblioteku

cfg.iface_type = ATCA_I2C_IFACE; // Vrsta komunikacije -> I2C način cfg.devtype = ATECC608A; // Tip č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 // Promijenite 1 sa O ako želite prekid na pin 2 // FALLING MODE = Pin na LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

void loop ()

{// Nema potrebe}

Master čvor

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

Kako to funkcionira: Glavni čvor šalje "WakeUP" paket slave -u i nakon čekanja daje odgovor slave -a s podacima.

U mom slučaju koristim niz od dva int:

// Wake UP paket

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

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

  1. Master se postavlja u način slušanja i čeka 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. Odštampajte podatke u serijskom formatu
  7. Način spavanja

Za AES šifriranje koristim ključ u utoru broj 9.

Ovo je moj kod za Master čvor

#include "Arduino.h"

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A biblioteka #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}; // nadzor nadzornika ISR (WDT_vect) {wdt_disable (); // onemogućivanje nadzornika} void sleepmode () {// onemogući ADC ADCSRA = 0; // briše razne zastavice za "reset" MCUSR = 0; // dozvoljavamo 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 kašnjenje od 8 sekundi 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); interrupts (); // jamči slijedeću instrukciju izvedenu sleep_cpu (); // otkazuje san iz mjere opreza sleep_disable (); } void setup () {Serial.begin (9600); // Pokretanje konstuktora za biblioteku 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čnite slušati radio.startListening (); while (radio.available ()) {uint8_t odgovor [32]; radio.read (& answer, sizeof (answer)); uint8_t node_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 Wakup paket"); } // Način spavanja 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. Žao mi je ako sam pogriješio u tekstu, ali engleski nije moj glavni jezik i govorim bolje nego što pišem.

Hvala što ste sve pročitali.

Uživaj.

Preporučuje se: