Talaan ng mga Nilalaman:

Wireless Encrypted Communication Arduino: 5 Hakbang
Wireless Encrypted Communication Arduino: 5 Hakbang

Video: Wireless Encrypted Communication Arduino: 5 Hakbang

Video: Wireless Encrypted Communication Arduino: 5 Hakbang
Video: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, Nobyembre
Anonim
Wireless Encrypted Communication Arduino
Wireless Encrypted Communication Arduino

Kamusta po sa lahat, Sa pangalawang artikulong ito, ipapaliwanag ko sa iyo kung paano gamitin ang chip Atecc608a upang ma-secure ang iyong wireless na komunikasyon. Para sa mga ito, gagamitin ko ang NRF24L01 + para sa Wireless na bahagi at ang Arduino UNO.

Ang micro chip ATECC608A ay dinisenyo ng MicroChip at nakakuha ng maraming mga tool sa seguridad. Halimbawa, ang chip na ito ay maaaring mag-imbak ng ECC Keys, AES Keys (para sa AES 128) at SHA2 Hash.

Ang artikulo: NRF24L01 + Arduino UNO + ATECC608A

Sa panahon ng isang komunikasyon sa pagitan ng dalawang IoT Object, maraming pag-atake ang maaaring mayroon: Man Of the banayad, Kopya ng impormasyon at marami pa.. Kaya't ang aking ideya ay napaka-simple:

  1. Paggamit ng naka-encrypt na data sa pagitan ng dalawa o higit pang IoT object.
  2. Mga supply ng mababang gastos
  3. Maaaring gumana sa isang Arduino UNO

Sa aking kaso, gumagamit ako

  • ang Atecc608a upang maiimbak ang aking AES Key at i-encrypt / i-decrypt ang aking data.
  • ang Arduino Uno bilang Microcontroller
  • Ang NRF24L01 upang maipadala ang aking data

Kailangan mong sundin ang mga hakbang na iyon para sa proyektong ito:

  1. I-set up ang chip ATECC608A
  2. Gawin ang circuit (Master Node at Slave Node)
  3. Bahagi ng code
  4. Lumayo pa !

Para sa mga unang hakbang na "I-set up ang chip ATECC608A", nagsulat ako ng iba pang artikulo na nagpapaliwanag sa bawat hakbang sa pagkakasunud-sunod. Narito ang link:

Magsimula ka na!

Mga gamit

Para sa proyektong ito kailangan mo:

  • 2 Arduino UNO o Arduino NANO o Arduino Mega
  • Ang ilang mga kawad
  • 2 Atecc608a (bawat gastos ay mas mababa sa 0.60 $)
  • 2 NRF24L01 +
  • 2 kapasitor (10 μF)
  • Mga Breadboard

Link sa aking artikulo na nagpapaliwanag kung paano i-set up ang chip ATECC608A -> Paano i-set up ang Atecc608a

Hakbang 1: 1. I-set up ang Atecc608a

1. I-set up ang Atecc608a
1. I-set up ang Atecc608a
1. I-set up ang Atecc608a
1. I-set up ang Atecc608a

Hindi ko idetalye ang bawat hakbang na susundan upang mag-set up ng isang ATECC608A sapagkat nagsulat ako ng isang buong artikulo na nagpapaliwanag sa bawat hakbang upang magawa ito. Upang i-set up ito, kailangan mong sundin ang "Hakbang 4" ng artikulong ito na tinatawag na "2. Configuration of the Chip (Atecc608a)"

Ang link ay: Paano mag-set up ng isang ATECC608A

Gayundin, kailangan mong ilagay ang parehong pagsasaayos para sa Atecc608a, bahagi ng master at alipin, kung hindi man hindi mo mai-decrypt ang iyong data

Babala:

Upang i-set up ang chip na ito, kailangan mong sundin ang bawat hakbang ng artikulo sa itaas nang maayos. Kung ang isang hakbang ay nawawala o ang chip ay hindi naka-lock, hindi mo magawa ang proyektong ito

Natitirang:

Sundin ang hakbang para dito:

  • Lumikha ng isang template ng pagsasaayos
  • Isulat ang template na ito sa maliit na tilad
  • I-lock ang Config Zone
  • Isulat ang iyong AES Key (128 Bits) sa isang puwang
  • I-lock ang Data Zone

Hakbang 2: 2. Disenyo ng Circuit (Master at Alipin)

2. Disenyo ng Circuit (Master at Alipin)
2. Disenyo ng Circuit (Master at Alipin)
2. Disenyo ng Circuit (Master at Alipin)
2. Disenyo ng Circuit (Master at Alipin)

Sa proyektong ito, magkakaroon ka ng isang Master Node at isang Slave Node.

I-print ng master node ang data na ipinapadala ng slave node nang malinaw. Hihiling ito ng data mula sa slave node tuwing X oras.

Pakikinig ng node ng alipin ang "network" at kapag nakatanggap ito ng isang "Humiling ng data", bubuo ito, i-encrypt ito at ipadala ito sa master node.

Para sa magkabilang panig, master at alipin ang circuit ay pareho:

  • Isang arduino Nano
  • Isang ATECC608A
  • Isang NRF24L01

Ikinabit ko ang circuit sa hakbang na ito (tingnan ang larawan sa itaas).

Para sa ATECC608A sa Arduino UNO, ito ay isang soic 8 pin. Idinagdag ko ang "tuktok na pagtingin" sa itaas:

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

Para sa NRF24L01 sa 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) -> para lamang sa Slode node, hindi ginamit sa Master mode

Bakit ginagamit ang IRQ pin ng NRF24L01

Napaka-kapaki-pakinabang ang IRQ pin, pinapayagan ng pin na ito na sabihin (LOW) kapag ang isang packet ay natanggap ng NRF24L01, kaya maaari naming ikabit ang isang Makagambala sa pin na ito upang gisingin ang node ng alipin.

Hakbang 3: 3. ang Code (Alipin at Master)

3. ang Code (Alipin at Master)
3. ang Code (Alipin at Master)

Slave Node

Gumagamit ako ng power save para sa slave Node dahil hindi ito kailangang makinig sa lahat ng oras.

Paano ito gumagana: makinig ang node ng alipin at maghintay upang makatanggap ng isang "Wake UP packet". Ang packet na ito ay ipinapadala ng Master node upang magtanong ng data mula sa alipin.

Sa aking kaso gumagamit ako ng isang array ng dalawang int:

// Wake UP packet

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

Kung ang aking node ay tumatanggap ng isang packet,

  1. gisingin ito, basahin ang packet na ito, kung ang packet ay isang "Wake UP",
  2. bumubuo ito ng data,
  3. i-encrypt ang data,
  4. ipadala ang data sa master, maghintay ng isang ACK packet,
  5. matulog

Para sa AES Encryption, gumagamit ako ng isang susi sa slot number 9.

Ito ang aking code para sa Slode node

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

# isama ang "SPI.h"

# isama ang "nRF24L01.h" # isama ang "RF24.h"

# isama ang "Wire.h"

// ATECC608A library

# isama ang "ATECCX08A_Arduino / cryptoauthlib.h" # isama ang "AES BASIC / aes_basic.h"

# tukuyin ang ID_NODE 255

# tukuyin ang AES_KEY (uint8_t) 9

ATCAIfaceCfg cfg;

Katayuan ng ATCA_STATUS;

Radyo RF24 (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / maikling pagpapaandar na naisakatuparan kapag ang pagkagambala ay nakatakda (IRQ LOW) * * * / void wakUpIRQ () {habang (radio.available ()) {int data [32]; radio.read (& data, 32); kung (data [0] == 20 && data [1] == 02) {float temp = 17.6; float hum = 16.4;

uint8_t data [16];

uint8_t cypherdata [16];

// Bumuo ng isang String upang maitakda ang lahat ng aking Halaga

// Ang bawat halaga ay pinaghihiwalay ng isang "|" at ang "$" ay nangangahulugang ang pagtatapos ng data // WARNING: Dapat ay mas mababa sa 11 haba String tmp_str_data = String (ID_NODE) + "|" + String (temp, 1) + "|" + String (hum, 1) + "$"; // laki ng 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (data, sizeof (data));

// I-encrypt ang data

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

// makabuo ng isang UUID batay sa tatlong unang numero = ID node

String uuid = String (ID_NODE) + String (rand); // Sukat ng 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, laki ng (tmp_uuid));

memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Itigil ang pakikinig sa radyo.stopListening ();

bool rslt;

// Send Data rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Start Listening radio.startListening (); kung (rslt) {// End and sleep mode Serial.println (F ("Tapos na")); }}}}}

walang bisa ang pag-setup ()

{Serial.begin (9600);

// Init ang tagapag-ayos para sa silid-aklatan

cfg.iface_type = ATCA_I2C_IFACE; // Uri ng komunikasyon -> I2C mode cfg.devtype = ATECC608A; // Type of chip cfg.atcai2c.slave_address = 0XC0; // I2C addresse (default na halaga) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Delay of wake up (1500 ms) cfg.rx_retry = 20;

radio.begin ();

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

radio.openWritingPipe (masteraddresse);

radio.openReadingPipe (1, slaveaddresse); // Attach interrupt to the pin 3 // Modify 1 by O if you want the interrupt to the pin 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

walang bisa loop ()

{ // Hindi na kailangan }

Master Node

Gumising ang master node bawat 8 segundo upang magtanong ng data mula sa alipin na Node

Paano ito gumagana: Ang master node ay nagpapadala ng isang "WakeUP" na packet sa alipin at pagkatapos maghintay ng isang sagot ng alipin na may data.

Sa aking kaso gumagamit ako ng isang array ng dalawang int:

// Wake UP packet

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

Kung ang node ng alipin ay magpadala ng isang ACK packet pagkatapos magpadala ang master ng isang pack na WakeUp:

  1. Nag-set up ang Master sa mode na Makinig at maghintay ng isang komunikasyon
  2. Kung komunikasyon
  3. I-extract ang 8 unang byte, pagnakawan ang tatlong unang byte ng 8 bytes, kung ito ang ID node
  4. I-extract ang 16 byte ng cypher
  5. I-decrypt ang data
  6. I-print ang data sa Serial
  7. Mode ng pagtulog

Para sa AES Encryption, gumagamit ako ng isang susi sa slot number 9.

Ito ang aking code para sa Master node

# isama ang "Arduino.h"

# isama ang "avr / sleep.h" #include "avr / wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A library # isama ang "ATECCX08A_Arduino / cryptoauthlib.h" #include "AES BASIC / aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; Katayuan ng ATCA_STATUS; Radyo RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // watchdog makagambala ISR (WDT_vect) {wdt_disable (); // disable watchdog} void sleepmode () {// disable ADC ADCSRA = 0; // clear iba't ibang mga "i-reset" na mga flag MCUSR = 0; // payagan ang mga pagbabago, huwag paganahin ang pag-reset ng WDTCSR = bit (WDCE) | bit (WDE); // set interrupt mode at isang agwat WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // set WDIE, at 8 segundo antala ang wdt_reset (); // reset the watchdog set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // time na pagkakasunud-sunod ay sumusunod sa sleep_enable (); // turn off brown ‐ out paganahin ang software MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); nakakagambala (); // ginagarantiyahan ang susunod na tagubilin naipatupad sleep_cpu (); // kanselahin ang pagtulog bilang pag-iingat sa pagtulog_disable (); } void setup () {Serial.begin (9600); // Init ang tagapag-ayos para sa silid-aklatan cfg.iface_type = ATCA_I2C_IFACE; // Uri ng komunikasyon -> I2C mode cfg.devtype = ATECC608A; // Type of chip cfg.atcai2c.slave_address = 0XC0; // I2C addresse (default na halaga) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Delay of wake up (1500 ms) cfg.rx_retry = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radyo.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Send Data rslt = radio.write (& awake_packet, sizeof (wake_packet)); kung (rslt) {// Start Listening radio.startListening (); habang (radio.available ()) {uint8_t sagot [32]; radio.read (& sagot, laki ng (sagot)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, sagot, 3); memcpy (cypher, sagot + 3, 16); kung ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS katayuan = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); kung (status == ATCA_SUCCESS) {Serial.println ("Na-decrypt na Data:"); para sa (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} iba pa {Serial.println ("Huwag tumanggap para sa Wakup Packet"); } // Sleep mode 8 segundo ng sleepmode (); }

Kung mayroon kang tanong, narito ako upang sagutin ito

Hakbang 4: 4. Pumunta Pa

Ang halimbawang ito ay simple upang mapabuti mo ang proyektong ito

Mga pagpapabuti:

  • Ang AES 128 ay pangunahing at maaari kang gumamit ng ibang algorithm ng AES bilang AES CBC upang maging mas ligtas.
  • Baguhin ang module na wireless (ang NRF24L01 ay limitado sa pamamagitan ng isang kargamento na 23 Bytes)

Kung nakikita mo ang pagpapabuti na gagawin, ipaliwanag ito sa lugar ng talakayan

Hakbang 5: Konklusyon

Inaasahan kong ang artikulong ito ay magiging kapaki-pakinabang para sa iyo. Paumanhin kung nagkamali ako sa aking teksto ngunit ang Ingles ay hindi ang aking pangunahing wika at mas mahusay akong magsalita kaysa sa pagsusulat.

Salamat sa pagbabasa ng lahat.

Tangkilikin mo ito

Inirerekumendang: