Kazalo:
- Zaloge
- 1. korak: 1. Nastavite Atecc608a
- 2. korak: 2. Oblikovanje vezja (glavni in pomožni)
- 3. korak: 3. Koda (podrejeni in glavni)
- 4. korak: 4. Pojdite naprej
- 5. korak: Zaključek
Video: Brezžična šifrirana komunikacija Arduino: 5 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:03
Pozdravljeni vsi skupaj, V tem drugem članku vam bom razložil, kako uporabiti čip Atecc608a za zaščito svoje brezžične komunikacije. Za to bom uporabil NRF24L01+ za brezžični del in Arduino UNO.
Mikro čip ATECC608A je zasnoval MicroChip in ima več varnostnih orodij. Na primer, ta čip lahko shrani ključe ECC, ključe AES (za AES 128) in SHA2 Hash.
Članek: NRF24L01 + Arduino UNO + ATECC608A
Med komunikacijo med dvema objektoma IoT lahko obstaja več napadov: Blagi človek, Kopija informacij in drugo.. Tako da je moja ideja zelo preprosta:
- Uporaba šifriranih podatkov med dvema ali več objekti IoT.
- Poceni zaloge
- Lahko sodeluje z Arduino UNO
V mojem primeru uporabljam
- Atecc608a za shranjevanje mojega ključa AES in za šifriranje/dešifriranje mojih podatkov.
- Arduino Uno kot mikrokrmilnik
- NRF24L01 za pošiljanje mojih podatkov
Za ta projekt morate slediti tem korakom:
- Nastavite čip ATECC608A
- Ali naredite vezje (glavno in pomožno vozlišče)
- Kodni del
- Pojdi dlje !
Za prve korake "Nastavitev čipa ATECC608A" sem napisal drug članek, ki po vrsti razlaga vsak korak. Povezava je tukaj:
Zdaj pa začni!
Zaloge
Za ta projekt potrebujete:
- 2 Arduino UNO ali Arduino NANO ali Arduino Mega
- Nekaj žice
- 2 Atecc608a (vsak stane manj kot 0,60 $)
- 2 NRF24L01+
- 2 kondenzator (10 μF)
- Ogledne plošče
Povezava do mojega članka, ki pojasnjuje, kako nastaviti čip ATECC608A -> Kako nastaviti Atecc608a
1. korak: 1. Nastavite Atecc608a
Ne bom podrobno opisoval vsakega koraka za namestitev ATECC608A, ker sem napisal celoten članek, ki pojasnjuje vse korake za to. Če ga želite nastaviti, sledite "4. koraku" tega članka, imenovanemu "2. Konfiguracija čipa (Atecc608a)"
Povezava je: Kako nastaviti ATECC608A
Prav tako morate nastaviti isto konfiguracijo za Atecc608a, glavno in pomožno stran, sicer podatkov ne boste mogli dešifrirati
Opozorilo:
Če želite nastaviti ta čip, morate zaporedno slediti vsem korakom v zgornjem članku. Če en korak manjka ali čip ni zaklenjen, tega projekta ne bi mogli izvesti
Ostanek:
Če želite to narediti, sledite tem korakom:
- Ustvarite konfiguracijsko predlogo
- To predlogo napišite v čip
- Zaklenite območje konfiguracije
- V režo zapišite svoj ključ AES (128 bitov)
- Zaklenite podatkovno območje
2. korak: 2. Oblikovanje vezja (glavni in pomožni)
V tem projektu boste imeli glavno in pomožno vozlišče.
Glavno vozlišče bo natisnilo podatke, ki jih pošlje podrejeno vozlišče, na čisto. Vsakič X bo zahteval podatke od podrejenega vozlišča.
Podrejeno vozlišče bo poslušalo "omrežje" in ko bo prejelo "Zahtevaj podatke", ga bo ustvarilo, šifriralo in poslalo v glavno vozlišče.
Za obe strani, glavni in pomožni je vezje enako:
- En arduino Nano
- En ATECC608A
- En NRF24L01
Na ta korak sem priključil vezje (cf slika zgoraj).
Za ATECC608A do Arduino UNO je to 8 -polni soic. Zgoraj sem dodal "pogled od zgoraj":
- 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 podrejeno vozlišče, ki se ne uporablja v glavnem načinu
Zakaj uporabljati IRQ pin NRF24L01
Pin IRQ je zelo uporaben, ta pin omogoča povedati (LOW), ko NRF24L01 sprejme paket, zato lahko temu pin pripnemo prekinitev, da prebudimo podrejeno vozlišče.
3. korak: 3. Koda (podrejeni in glavni)
Podrejeno vozlišče
Za podrejeno vozlišče uporabljam varčevanje z energijo, ker mu ni treba ves čas poslušati.
Kako deluje: pomožno vozlišče posluša in počaka, da prejme paket "Wake UP". Ta paket pošlje glavno vozlišče, da od podrejenega zahteva podatke.
V mojem primeru uporabljam niz dveh int:
// paket Wake UP
const int wake_packet [2] = {20, 02};
Če moje vozlišče prejme paket,
- zbudi se, preberi ta paket, če je paket "Wake UP",
- ustvarja podatke,
- šifriranje podatkov,
- pošljite podatke glavnemu računalniku, počakajte na paket ACK,
- spi.
Za šifriranje AES uporabljam ključ v reži številka 9.
To je moja koda za vozlišče 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;
Stanje ATCA_STATUS;
Radio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / brief Funkcija se izvede, ko je prekinitev nastavljena (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& podatki, 32); if (podatki [0] == 20 && podatki [1] == 02) {float temp = 17,6; plavajoče brujanje = 16,4;
uint8_t podatki [16];
uint8_t šifrirani podatki [16];
// Zgradite niz, da nastavite vso mojo vrednost
// Vsaka vrednost je ločena z "|" in "$" pomeni konec podatkov // OPOZORILO: Mora biti krajši od 11 dolžine Niz tmp_str_data = Niz (ID_NODE) + "|" + Niz (temp, 1) + "|" + Niz (hum, 1) + "$"; // velikost 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (podatki, velikost (podatki));
// Šifriranje podatkov
ATCA_STATUS status = aes_basic_encrypt (& cfg, podatki, velikost (podatki), šifrirani podatki, AES_KEY); if (status == ATCA_SUCCESS) {long rand = naključno ((dolgo) 10000, (dolgo) 99999);
// ustvarimo UUID na podlagi treh prvih vozlišč number = ID
Niz uuid = Niz (ID_NODE) + Niz (rand); // Velikost 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)); // Prenehaj poslušati radio.stopListening ();
bool rslt;
// Pošlji podatke rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Začni poslušati radio.startListening (); if (rslt) {// Končni in spalni način Serial.println (F ("Končano")); }}}}}
void setup ()
{Serial.begin (9600);
// Začetek graditelja za knjižnico
cfg.iface_type = ATCA_I2C_IFACE; // Vrsta komunikacije -> način I2C cfg.devtype = ATECC608A; // Vrsta čipa cfg.atcai2c.slave_address = 0XC0; // naslov I2C (privzeta vrednost) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Zamuda prebujanja (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či prekinitev na pin 3 // Spremeni 1 z O, če želiš prekinitev na pin 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
void loop ()
{ // Ni potrebno }
Glavno vozlišče
Glavno vozlišče se zbudi vsakih 8 sekund in zahteva podatke od podrejenega vozlišča
Kako deluje: Glavno vozlišče pošlje pomožnemu paketu paket "WakeUP" in po čakanju odgovori podrejenega s podatki.
V mojem primeru uporabljam niz dveh int:
// paket Wake UP
const int wake_packet [2] = {20, 02};
Če podrejeno vozlišče pošlje paket ACK, potem ko je glavni poslal paket WakeUp:
- Glavni nastavite v načinu poslušanja in počakajte na komunikacijo
- Če komunikacija
- Izvlecite prvi 8 bajt, izločite prve tri bajte od 8 bajtov, če je to vozlišče ID
- Izvlecite 16 -bajtno šifro
- Dešifrirajte podatke
- Natisnite podatke v zaporedju
- Spanje
Za šifriranje AES uporabljam ključ v reži številka 9.
To je moja koda za vozlišče Master
#vključi "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; Stanje ATCA_STATUS; Radio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // zbudi paket const int wake_packet [2] = {20, 02}; // nadzor ISR (WDT_vect) {wdt_disable (); // onemogoči nadzornika} void sleepmode () {// onemogoči ADC ADCSRA = 0; // počisti različne zastavice "reset" MCUSR = 0; // dovolite spremembe, onemogočite ponastavitev WDTCSR = bit (WDCE) | bit (WDE); // nastavimo način prekinitve in interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // nastavimo WDIE in 8 sekundno zamudo wdt_reset (); // ponastavimo nadzornika set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // časovno zaporedje sledi sleep_enable (); // izklop omogočanja rjavega izklopa v programski opremi MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); prekinitve (); // jamči za izvedbo naslednjega ukaza sleep_cpu (); // kot previdnostni ukrep prekliči spanje sleep_disable (); } void setup () {Serial.begin (9600); // Začetek graditelja knjižnice cfg.iface_type = ATCA_I2C_IFACE; // Vrsta komunikacije -> način I2C cfg.devtype = ATECC608A; // Vrsta čipa cfg.atcai2c.slave_address = 0XC0; // naslov I2C (privzeta vrednost) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Zamuda prebujanja (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; // Pošlji podatke rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Začni posluš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 izhod [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, šifra, 16, izhod, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Dešifrirani podatki:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack ni sprejet za paket za preklop"); } // Način spanja 8 sekund sleepmode (); }
Če imate vprašanje, sem tu, da vam odgovorim
4. korak: 4. Pojdite naprej
Ta primer je preprost, zato lahko projekt izboljšate
Izboljšave:
- AES 128 je osnovni in za večjo varnost lahko uporabite drug algoritem AES kot AES CBC.
- Zamenjajte brezžični modul (NRF24L01 je omejen s koristno obremenitvijo 23 bajtov)
- …
Če opazite izboljšave, jih razložite na področju za razpravo
5. korak: Zaključek
Upam, da vam bo ta članek koristen. Oprostite, če sem naredil napako v besedilu, vendar angleščina ni moj glavni jezik in govorim bolje, kot pišem.
Hvala, ker ste prebrali vse.
Uživaj.
Priporočena:
Brezžična komunikacija SmartHome: skrajne osnove MQTT: 3 koraki
Brezžična komunikacija SmartHome: skrajne osnove MQTT: osnove MQTT: ** delal bom serijo domače avtomatizacije, šel bom skozi korake, ki sem jih naredil, da bi se naučil vsega, kar sem naredil v prihodnosti. Ta Instructable je osnova za nastavitev MQTT za uporabo v mojih prihodnjih Instructables. Howeve
Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov
Brezžična komunikacija LoRa od 3 do 8 km z nizkimi stroški E32 (sx1278/sx1276) Naprava za Arduino, Esp8266 ali Esp32: Ustvarjam knjižnico za upravljanje EBYTE E32 na podlagi serije Semtech naprav LoRa, zelo zmogljiva, preprosta in poceni naprava. Različica 3 km tukaj, različica 8 km tukaj Lahko delajo na razdalji od 3000 do 8000 m in imajo veliko funkcij in
Dolga razdalja, 1,8 km, brezžična komunikacija Arduino-Arduino s HC-12 .: 6 korakov (s slikami)
Dolga razdalja, 1,8 km, brezžična komunikacija Arduino-Arduino s HC-12 .: V tem navodilu se boste naučili komunicirati med Arduinosom na dolge razdalje do 1,8 km na prostem. HC-12 je brezžično serijsko vrata komunikacijski modul, ki je zelo uporaben, izredno zmogljiv in enostaven za uporabo. Najprej boste zapustili
Brezžična komunikacija z oddajnim modulom NRF24L01 za projekte na osnovi Arduino: 5 korakov (s slikami)
Brezžična komunikacija z oddajnim modulom NRF24L01 za projekte, ki temeljijo na Arduinu: To je moja druga vadnica o robotih in mikrokrmilnikih, ki jih je mogoče poučiti. Res je neverjetno videti svojega robota živega in delujočega po pričakovanjih in verjemite, da bo bolj zabavno, če z robotom ali drugimi brezžičnimi napravami upravljate hitro in
Brezžična brezžična električna energija v radijskih valovih v Katmanduju: 6 korakov
Brezžična brezžična oblika električnih radijskih valov v Katmanduju: Kar sem naredil, sem to prilagodil in poenostavil in ima samo dva konca namesto štirih. Prava velikost palačinke z dvema koncema, povezanima z Arialom, in tla delujeta kot sprejemnik. Dolg odsek dveh arij, eden povezan z g