Bezvadu šifrēta komunikācija Arduino: 5 soļi
Bezvadu šifrēta komunikācija Arduino: 5 soļi
Anonim
Bezvadu šifrēta komunikācija Arduino
Bezvadu šifrēta komunikācija Arduino

Sveiki visiem, Šajā otrajā rakstā es jums paskaidrošu, kā izmantot mikroshēmu Atecc608a, lai nodrošinātu bezvadu sakarus. Šim nolūkam es izmantošu NRF24L01+ bezvadu daļai un Arduino UNO.

Mikročipu ATECC608A ir izstrādājis MicroChip, un tam ir vairāki drošības rīki. Piemēram, šajā mikroshēmā var saglabāt ECC atslēgas, AES atslēgas (AES 128) un SHA2 hash.

Raksts: NRF24L01 + Arduino UNO + ATECC608A

Sazinoties starp diviem IoT objektiem, var būt vairāki uzbrukumi: Man Of the mild, Informācijas kopija un daudz kas cits.. Tātad mana ideja ir ļoti vienkārša:

  1. Šifrētu datu izmantošana starp diviem vai vairākiem IoT objektiem.
  2. Piegādes par zemām izmaksām
  3. Var strādāt ar Arduino UNO

Manā gadījumā es izmantoju

  • Atecc608a, lai uzglabātu manu AES atslēgu un šifrētu/atšifrētu manus datus.
  • Arduino Uno kā mikrokontrolleris
  • NRF24L01, lai nosūtītu manus datus

Šim projektam ir jāveic šādas darbības:

  1. Iestatiet mikroshēmu ATECC608A
  2. Veiciet ķēdi (galvenais mezgls un vergu mezgls)
  3. Koda daļa
  4. Iet tālāk !

Pirmajiem soļiem "Iestatiet mikroshēmu ATECC608A" es uzrakstīju citu rakstu, kurā paskaidrots katrs solis. Saite ir šeit:

Tagad sāc!

Piegādes

Šim projektam jums ir nepieciešams:

  • 2 Arduino UNO vai Arduino NANO vai Arduino Mega
  • Kāds vads
  • 2 Atecc608a (katra maksā mazāk par 0,60 USD)
  • 2 NRF24L01+
  • 2 kondensators (10 μF)
  • Maizes dēļi

Saite uz manu rakstu, kurā paskaidrots, kā iestatīt mikroshēmu ATECC608A -> Kā iestatīt Atecc608a

1. darbība: 1. Iestatiet Atecc608a

1. Iestatiet Atecc608a
1. Iestatiet Atecc608a
1. Iestatiet Atecc608a
1. Iestatiet Atecc608a

Es neaprakstīšu katru soli, kas jāievēro, lai iestatītu ATECC608A, jo es uzrakstīju pilnu rakstu, kurā paskaidroti visi soļi, kā to izdarīt. Lai to iestatītu, jums jāievēro šī raksta 4. darbība ar nosaukumu "2. mikroshēmas konfigurācija (Atecc608a)"

Saite ir šāda: Kā iestatīt ATECC608A

Tāpat jums ir jāievada tāda pati konfigurācija Atecc608a, galvenajai un palīgpusei, pretējā gadījumā jūs nevarēsit atšifrēt savus datus

Brīdinājums:

Lai iestatītu šo mikroshēmu, jums ir jāveic visas iepriekšējā raksta darbības secībā. Ja trūkst viena soļa vai mikroshēma nav bloķēta, jūs nevarētu veikt šo projektu

Atlikums:

Lai to izdarītu, veiciet tālāk norādītās darbības

  • Izveidojiet konfigurācijas veidni
  • Uzrakstiet šo veidni mikroshēmā
  • Bloķējiet konfigurācijas zonu
  • Ierakstiet AES atslēgu (128 biti) slotā
  • Datu zonas bloķēšana

2. solis: 2. Ķēdes dizains (meistars un vergs)

2. Ķēdes dizains (meistars un vergs)
2. Ķēdes dizains (meistars un vergs)
2. Ķēdes dizains (meistars un vergs)
2. Ķēdes dizains (meistars un vergs)

Šajā projektā jums būs galvenais mezgls un vergu mezgls.

Galvenais mezgls skaidri izdrukās vergu mezgla nosūtītos datus. Tā pieprasīs datus no vergu mezgla katru X reizi.

Vergu mezgls uzklausīs "tīklu" un, saņemot "pieprasījuma datus", to ģenerēs, šifrēs un nosūtīs uz galveno mezglu.

Abās pusēs ķēde un meistars ir vienādi:

  • Viens arduino Nano
  • Viens ATECC608A
  • Viens NRF24L01

Es pievienoju shēmu šim solim (sk. Attēlu iepriekš).

Attiecībā uz ATECC608A uz Arduino UNO tas ir 8 pin kontakts. Iepriekš pievienoju "skatu no augšas":

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

Attiecībā uz NRF24L01 uz 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) -> tikai vergu mezglam, netiek izmantots galvenajā režīmā

Kāpēc izmantot NRF24L01 IRQ tapu?

IRQ tapa ir ļoti noderīga, šī tapa ļauj pateikt (LOW), kad NRF24L01 saņem paketi, tāpēc mēs varam piespraust šo tapu, lai pamodinātu vergu mezglu.

3. solis: 3. kods (vergs un meistars)

3. kodekss (vergs un meistars)
3. kodekss (vergs un meistars)

Vergu mezgls

Es izmantoju enerģijas taupīšanu vergu mezglam, jo tam nav nepieciešams visu laiku klausīties.

Kā tas darbojas: vergu mezgls klausās un gaida, kad saņems modināšanas paketi. Šo paketi nosūta galvenais mezgls, lai lūgtu datus no verga.

Manā gadījumā es izmantoju divu masīvu:

// Wake UP pakete

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

Ja mans mezgls saņem paketi,

  1. tas pamostas, izlasiet šo paketi, ja pakete ir "Wake UP",
  2. tas ģenerē datus,
  3. šifrēt datus,
  4. nosūtiet datus galvenajam, pagaidiet ACK paketi,
  5. Gulēt.

AES šifrēšanai es izmantoju atslēgu slota numurā 9.

Šis ir mans Slave mezgla kods

#iekļaut "Arduino.h" #iekļaut "avr/sleep.h" #iekļaut "avr/wdt.h"

#ietver "SPI.h"

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

#ietver "Wire.h"

// ATECC608A bibliotēka

#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"

#definēt ID_NODE 255

#define AES_KEY (uint8_t) 9

ATCAIfaceCfg cfg;

ATCA_STATUS statuss;

Radio RF24 (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / īss Funkcija tiek izpildīta, ja ir iestatīts pārtraukums (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& dati, 32); ja (dati [0] == 20 && dati [1] == 02) {pludiņa temp = 17,6; pludiņš hum = 16,4;

uint8_t dati [16];

uint8_t cypherdata [16];

// Izveidojiet virkni, lai iestatītu visu manu vērtību

// Katra vērtība ir atdalīta ar "|" un "$" nozīmē datu beigas // BRĪDINĀJUMS. Jābūt mazākam par 11 garuma virknēm tmp_str_data = String (ID_NODE) + "|" + Virkne (temp, 1) + "|" + Stīga (hum, 1) + "$"; // izmērs 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (dati, lielums (dati));

// Šifrēt datus

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

// ģenerēt UUID, pamatojoties uz trim pirmajiem skaitļiem = ID mezgliem

String uuid = String (ID_NODE) + String (rand); // Izmērs 8

uint8_t tmp_uuid [8];

uint8_t dati_sūtīt [32];

uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);

memcpy (dati_sūtīt, tmp_uuid, sizeof (tmp_uuid));

memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Beidz klausīties radio.stopListening ();

bool rslt;

// Sūtīt datus rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Sākt klausīties radio.startListening (); if (rslt) {// Beigu un miega režīms Serial.println (F ("Gatavs")); }}}}}

anulēts iestatījums ()

{Sērijas sākums (9600);

// Iniciatē bibliotēkas padomdevēju

cfg.iface_type = ATCA_I2C_IFACE; // Komunikācijas veids -> I2C režīms cfg.devtype = ATECC608A; // Mikroshēmas veids cfg.atcai2c.slave_address = 0XC0; // I2C adrese (noklusējuma vērtība) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Modināšanas aizkavēšanās (1500 ms) cfg.rx_retries = 20;

radio.begin ();

radio.setDataRate (RF24_250KBPS); radio.maskaIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);

radio.openWritingPipe (masteraddresse);

radio.openReadingPipe (1, slaveaddresse); // Piestipriniet pārtraukumu pie tapas 3 // Modificējiet 1 ar O, ja vēlaties pārtraukt tapu 2 // FALLING MODE = Pin pie LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

tukša cilpa ()

{ // Nav vajadzības }

Galvenais mezgls

Galvenais mezgls pamostas ik pēc 8 sekundēm, lai lūgtu datus no vergu mezgla

Kā tas darbojas: galvenais mezgls nosūta vergam paketi "WakeUP" un pēc gaidīšanas verga atbildi ar datiem.

Manā gadījumā es izmantoju divu masīvu:

// Wake UP pakete

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

Ja vergu mezgls nosūta ACK paketi pēc tam, kad galvenais ir nosūtījis WakeUp paketi:

  1. Galvenais iestatiet klausīšanās režīmā un gaidiet saziņu
  2. Ja komunikācija
  3. Izvelciet 8 pirmo baitu, izlaupiet trīs pirmos baitus no 8 baitiem, ja tas ir ID mezgls
  4. Izvelciet 16 baitu šifra
  5. Atšifrējiet datus
  6. Drukājiet datus sērijveidā
  7. Miega režīms

AES šifrēšanai es izmantoju atslēgu slota numurā 9.

Šis ir mans galvenā mezgla kods

#ietver "Arduino.h"

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A bibliotēka #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 statuss; Radio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // sargsuņa pārtraukšanas ISR (WDT_vect) {wdt_disable (); // disable watchdog} void sleepmode () {// atspējot ADC ADCSRA = 0; // notīrīt dažādus "atiestatīšanas" karodziņus MCUSR = 0; // atļaut izmaiņas, atspējot atiestatīšanu WDTCSR = bit (WDCE) | bits (WDE); // iestatīt pārtraukuma režīmu un intervālu WDTCSR = bits (WDIE) | bits (WDP3) | bits (WDP0); // iestatīt WDIE, un 8 sekundes aizkavēt wdt_reset (); // atiestatīt sargsuņa set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // laika secība seko sleep_enable (); // programmatūrā izslēgt brūnās izslēgšanas iespējošanu MCUCR = bit (BODS) | bits (BODSE); MCUCR = bits (BODS); pārtrauc (); // garantē nākamo norādījumu izpildi sleep_cpu (); // atcelt miegu kā piesardzību sleep_disable (); } void setup () {Serial.begin (9600); // Uzsāciet bibliotēkas izstrādātāju cfg.iface_type = ATCA_I2C_IFACE; // Komunikācijas veids -> I2C režīms cfg.devtype = ATECC608A; // Mikroshēmas veids cfg.atcai2c.slave_address = 0XC0; // I2C adrese (noklusējuma vērtība) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Modināšanas aizkavēšanās (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskaIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Sūtīt datus rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Sāk klausīties radio.startListening (); while (radio.available ()) {uint8_t atbilde [32]; radio.read (& atbilde, sizeof (atbilde)); uint8_t node_id [3]; uint8_t cipars [16]; memcpy (mezgla ID, atbilde, 3); memcpy (cipars, atbilde + 3, 16); if ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS statuss = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (statuss == ATCA_SUCCESS) {Serial.println ("Atšifrēti dati:"); par (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack not get for Wakup Packet"); } // Miega režīms 8 sekunžu miega režīms (); }

Ja jums ir jautājums, es esmu šeit, lai atbildētu

4. solis: 4. Iet tālāk

Šis piemērs ir vienkāršs, lai jūs varētu uzlabot šo projektu

Uzlabojumi:

  • AES 128 ir pamata, un jūs varat izmantot citu AES algoritmu kā AES CBC, lai būtu drošāk.
  • Nomainiet bezvadu moduli (NRF24L01 ir ierobežota ar 23 baitu lietderīgo slodzi)

Ja redzat uzlabojumus, paskaidrojiet tos diskusiju jomā

5. darbība. Secinājums

Es ceru, ka šis raksts jums būs noderīgs. Atvainojiet, ja kļūdījos tekstā, bet angļu valoda nav mana galvenā valoda, un es runāju labāk nekā rakstu.

Paldies, ka izlasījāt visu.

Izbaudi to.

Ieteicams: