Sadržaj:
- Pribor
- Korak 1: 1. Postavite Atecc608a
- Korak 2: 2. Dizajn kruga (glavni i podređeni)
- Korak 3: 3. Kôd (slave i master)
- Korak 4: 4. Idite dalje
- Korak 5: Zaključak
Video: Bežična šifrirana komunikacija Arduino: 5 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:33
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:
- Korištenje šifriranih podataka između dva ili više IoT objekata.
- Povoljne zalihe
- 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:
- Postavite čip ATECC608A
- Učinite krug (glavni čvor i podređeni čvor)
- Kodni dio
- 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
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)
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)
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,
- probudi se, pročitaj ovaj paket, ako je paket "Wake UP",
- generira podatke,
- šifriranje podataka,
- pošaljite podatke masteru, pričekajte ACK paket,
- 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:
- Master se postavi u način slušanja i pričekajte komunikaciju
- Ako komunikacija
- Izdvojite prvi 8 bajt, otkupite prva tri bajta od 8 bajtova, ako je ovo ID čvor
- Izdvojite 16 bajta šifre
- Dešifrirajte podatke
- Ispišite podatke u serijskom broju
- 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:
Bežična komunikacija SmartHome: ekstremne osnove MQTT -a: 3 koraka
Bežična komunikacija SmartHome: ekstremne osnove MQTT -a: Osnove MQTT -a: ** Radit ću seriju kućne automatizacije, proći ću korake koje sam poduzeo kako bih naučio sve što sam radio u budućnosti. Ovaj Instructable temelj je o tome kako postaviti MQTT za upotrebu u mojim budućim Instructables. Međutim
LoRa bežična komunikacija od 3 do 8 km s niskim troškovima E32 (sx1278/sx1276) uređaj za Arduino, Esp8266 ili Esp32: 15 koraka
LoRa bežična komunikacija od 3 km do 8 km s niskim troškovima E32 (sx1278/sx1276) Uređaj za Arduino, Esp8266 ili Esp32: Stvaram knjižnicu za upravljanje EBYTE E32 na temelju Semtech serije LoRa uređaja, vrlo snažan, jednostavan i jeftin uređaj. Možete pronaći Ovdje je verzija od 3 km, verzija od 8 kilometara Ovdje mogu raditi na udaljenostima od 3000 do 8000 metara, a imaju mnogo mogućnosti i
Daleki domet, 1,8 km, bežična komunikacija Arduino do Arduino s HC-12 .: 6 koraka (sa slikama)
Bežična komunikacija na daljinu, 1,8 km, bežična komunikacija između Arduina i Arduina s HC-12 .: U ovom uputstvu naučit ćete kako komunicirati između Arduinosa na velike udaljenosti do 1,8 km na otvorenom. HC-12 je bežični serijski priključak komunikacijski modul koji je vrlo koristan, izuzetno moćan i jednostavan za korištenje. Prvo ćete napustiti
Bežična komunikacija pomoću modula primopredajnika NRF24L01 za projekte temeljene na Arduinu: 5 koraka (sa slikama)
Bežična komunikacija pomoću NRF24L01 primopredajničkog modula za Arduino temeljene projekte: Ovo je moj drugi vodič za robote i mikrokontrolere. Zaista je nevjerojatno vidjeti svog robota živog i kako radi kako se očekuje i vjerujte da će biti zabavnije ako upravljate svojim robotom ili drugim bežičnim stvarima brzo i
Bežična komunikacija pomoću jeftinih RF modula od 433MHz i mikrokontrolera Pic. 2. dio: 4 koraka (sa slikama)
Bežična komunikacija pomoću jeftinih RF modula od 433MHz i Pic mikrokontrolera. Drugi dio: U prvom dijelu ovog uputstva pokazao sam kako programirati PIC12F1822 koristeći MPLAB IDE i XC8 kompajler, za slanje jednostavnog niza bežično pomoću jeftinih TX/RX 433MHz modula. Prijemnički modul je spojen preko USB -a na UART TTL kabelski oglas