Talaan ng mga Nilalaman:
- Mga gamit
- Hakbang 1: 1. I-set up ang Atecc608a
- Hakbang 2: 2. Disenyo ng Circuit (Master at Alipin)
- Hakbang 3: 3. ang Code (Alipin at Master)
- Hakbang 4: 4. Pumunta Pa
- Hakbang 5: Konklusyon
Video: Wireless Encrypted Communication Arduino: 5 Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:11
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:
- Paggamit ng naka-encrypt na data sa pagitan ng dalawa o higit pang IoT object.
- Mga supply ng mababang gastos
- 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:
- I-set up ang chip ATECC608A
- Gawin ang circuit (Master Node at Slave Node)
- Bahagi ng code
- 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
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)
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)
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,
- gisingin ito, basahin ang packet na ito, kung ang packet ay isang "Wake UP",
- bumubuo ito ng data,
- i-encrypt ang data,
- ipadala ang data sa master, maghintay ng isang ACK packet,
- 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:
- Nag-set up ang Master sa mode na Makinig at maghintay ng isang komunikasyon
- Kung komunikasyon
- I-extract ang 8 unang byte, pagnakawan ang tatlong unang byte ng 8 bytes, kung ito ang ID node
- I-extract ang 16 byte ng cypher
- I-decrypt ang data
- I-print ang data sa Serial
- 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:
Ang SmartHome Wireless Communication: ang Extreme Basics ng MQTT: 3 Hakbang
Ang SmartHome Wireless Communication: ang Extreme Basics ng MQTT: Mga Pangunahing Kaalaman sa MQTT: ** Gagawin ko ang isang serye sa Home Automation, dadaanin ko ang mga hakbang na kinuha ko upang malaman ang lahat ng nagawa ko sa hinaharap. Ang Instructable na ito ay ang batayan sa kung paano mag-set up ng MQTT para magamit sa aking hinaharap na Mga Instructable. Howeve
LoRa 3Km hanggang 8Km Wireless Communication Na May Mababang Gastos E32 (sx1278 / sx1276) Device para sa Arduino, Esp8266 o Esp32: 15 Hakbang
LoRa 3Km hanggang 8Km Wireless Communication Sa Mababang Gastos E32 (sx1278 / sx1276) Device para sa Arduino, Esp8266 o Esp32: Lumilikha ako ng isang library upang pamahalaan ang EBYTE E32 batay sa serye ng Semtech ng aparato ng LoRa, napakalakas, simple at murang aparato. Maaari mong makita Bersyon ng 3Km dito, bersyon 8Km dito. Maaari silang gumana sa layo na 3000m hanggang 8000m, at mayroon silang maraming mga tampok na
Wireless Arduino Robot Gamit ang HC12 Wireless Module: 7 Mga Hakbang
Wireless Arduino Robot Gamit ang HC12 Wireless Module: Hey guys, maligayang pagdating pabalik. Sa aking nakaraang post, ipinaliwanag ko kung ano ang isang H Bridge Circuit, L293D motor driver IC, piggybacking L293D Motor driver IC para sa pagmamaneho ng mataas na kasalukuyang mga driver ng motor at kung paano mo mai-disenyo at gumawa ng iyong sariling L293D motor Driver Board,
Long Range, 1.8km, Arduino hanggang Arduino Wireless Communication Sa HC-12 .: 6 Mga Hakbang (na may Mga Larawan)
Long Range, 1.8km, Arduino to Arduino Wireless Communication Sa HC-12 .: Sa itinuturo na ito malalaman mo kung paano makipag-usap sa pagitan ng Arduinos sa isang mahabang distansya hanggang sa 1.8km sa bukas na hangin. Ang HC-12 ay isang wireless serial port module ng komunikasyon na napaka kapaki-pakinabang, napakalakas at madaling gamitin. Una kang
Wireless Serial Communication Gamit ang Bluefruit: 4 Hakbang
Wireless Serial Communication Paggamit ng Bluefruit: Narito ang isang simpleng gabay sa hakbang upang mapalitan ang iyong mga wire gamit ang isang koneksyon ng mababang enerhiya na Bluetooth: Tumagal ako ng ilang panahon upang malaman ito dahil halos walang anumang dokumentasyon sa paggawa nito sa modernong Bluetooth na mababang enerhiya tech tulad ng bilang ang Bluefrui