Sadržaj:
- Supplies
- Korak 1: 1. Postavite Atecc608a
- Korak 2: 2. Dizajn kola (master i slave)
- 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 izmjena: 2024-01-30 08:05
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:
- Korištenje šifriranih podataka između dva ili više IoT objekata.
- Potrošni materijal
- 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:
- Postavite čip ATECC608A
- Učinite krug (glavni čvor i podređeni čvor)
- Kodni deo
- 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
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)
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)
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,
- probudi se, pročitaj ovaj paket, ako je paket "Wake UP",
- generira podatke,
- šifriranje podataka,
- pošaljite podatke masteru, pričekajte ACK paket,
- 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:
- Master se postavlja u način slušanja i čeka 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
- Odštampajte podatke u serijskom formatu
- 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:
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 je osnova za postavljanje MQTT -a za upotrebu u mojim budućim Instructables -ima. 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 do 8 km s niskim troškovima E32 (sx1278/sx1276) Uređaj za Arduino, Esp8266 ili Esp32: Stvaram biblioteku 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 funkcija 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 velike udaljenosti, 1,8 km, bežična komunikacija Arduino-Arduino 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 port 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 zasnovane 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 mi da će biti zabavnije ako upravljate svojim robotom ili drugim bežičnim stvarima brzim i
Bežična komunikacija pomoću jeftinih RF modula od 433MHz i Pic mikrokontrolera. Dio 2: 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 povezan preko USB -a na UART TTL kablovski oglas