Obsah:
- Zásoby
- Krok 1: 1. Nastavte Atecc608a
- Krok 2: 2. Návrh obvodu (hlavní a podřízený)
- Krok 3: 3. Kód (Slave a Master)
- Krok 4: 4. Pokračujte dále
- Krok 5: Závěr
Video: Bezdrátová šifrovaná komunikace Arduino: 5 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:20
Ahoj všichni, V tomto druhém článku vám vysvětlím, jak pomocí čipu Atecc608a zabezpečit vaši bezdrátovou komunikaci. K tomu použiji NRF24L01+ pro bezdrátovou část a Arduino UNO.
Mikročip ATECC608A byl navržen společností MicroChip a má několik bezpečnostních nástrojů. Tento čip může například ukládat klíče ECC, AES Keys (pro AES 128) a SHA2 Hash.
Článek: NRF24L01 + Arduino UNO + ATECC608A
Během komunikace mezi dvěma objekty IoT může existovat více útoků: muž mírných, kopie informací a další.. Moje představa je tedy velmi jednoduchá:
- Využití šifrovaných dat mezi dvěma nebo více objekty IoT.
- Nízké náklady na dodávky
- Může pracovat s Arduino UNO
V mém případě používám
- Atecc608a k ukládání mého klíče AES a k šifrování/dešifrování mých dat.
- Arduino Uno jako mikrokontrolér
- NRF24L01 k odeslání mých dat
Pro tento projekt musíte provést tyto kroky:
- Nastavte čip ATECC608A
- Proveďte zapojení (hlavní uzel a podřízený uzel)
- Část kódu
- Jít dál !
Pro první kroky „Nastavení čipu ATECC608A“jsem napsal další článek, který vysvětluje každý krok v pořadí. Odkaz je zde:
Nyní začněte!
Zásoby
Pro tento projekt potřebujete:
- 2 Arduino UNO nebo Arduino NANO nebo Arduino Mega
- Nějaký drát
- 2 Atecc608a (každý stojí méně než 0,60 $)
- 2 NRF24L01+
- 2 kondenzátor (10 μF)
- Prkénka
Odkaz na můj článek, který vysvětluje, jak nastavit čip ATECC608A -> Jak nastavit Atecc608a
Krok 1: 1. Nastavte Atecc608a
Nebudu podrobně popisovat každý krok k nastavení ATECC608A, protože jsem napsal celý článek, který vysvětluje všechny kroky k jeho provedení. Chcete -li jej nastavit, musíte postupovat podle „kroku 4“tohoto článku s názvem „2. Konfigurace čipu (Atecc608a)“
Odkaz je: Jak nastavit ATECC608A
Rovněž musíte vložit stejnou konfiguraci pro Atecc608a, hlavní a podřízenou stranu, jinak nebudete moci svá data dešifrovat
Varování:
Chcete -li nastavit tento čip, musíte v pořádku provést všechny kroky výše uvedeného článku. Pokud chybí jeden krok nebo čip není uzamčen, tento projekt byste nezvládli
Zbytek:
K tomu postupujte takto:
- Vytvořte konfigurační šablonu
- Tuto šablonu napište na čip
- Uzamkněte konfigurační zónu
- Napište svůj klíč AES (128 bitů) do slotu
- Uzamkněte datovou zónu
Krok 2: 2. Návrh obvodu (hlavní a podřízený)
V tomto projektu budete mít hlavní uzel a podřízený uzel.
Hlavní uzel vytiskne data odeslaná podřízeným uzlem jako vymazaná. Bude vyžadovat data z podřízeného uzlu pokaždé X.
Podřízený uzel naslouchá „síti“a když obdrží „Požadovaná data“, vygeneruje je, zašifruje a odešle do hlavního uzlu.
Obvod master i slave jsou na obou stranách stejné:
- Jedno arduino Nano
- Jeden ATECC608A
- Jeden NRF24L01
K tomuto kroku jsem připojil obvod (viz obrázek výše).
U ATECC608A k Arduino UNO je to 8 pinů. Výše jsem přidal „pohled shora“:
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Pro NRF24L01 pro 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) -> pouze pro podřízený uzel, nepoužívá se v režimu Master
Proč použít pin IRQ na NRF24L01
Pin IRQ je velmi užitečný, tento pin umožňuje říci (LOW), když je NRF24L01 přijat paket, takže k tomuto pinu můžeme připojit přerušení, aby se probudil podřízený uzel.
Krok 3: 3. Kód (Slave a Master)
Slave uzel
Pro podřízený uzel používám úsporu energie, protože nemusí neustále poslouchat.
Jak to funguje: podřízený uzel poslouchá a čeká na přijetí „Wake UP packetu“. Tento paket je odeslán uzlem Master k vyžádání dat od slave.
V mém případě používám pole dvou int:
// Paket probuzení
const int wake_packet [2] = {20, 02};
Pokud můj uzel přijme paket,
- probuď se, přečti si tento paket, pokud je paket „Wake UP“,
- generuje data,
- zašifrovat data,
- poslat data masteru, počkat na ACK paket,
- spát.
Pro šifrování AES používám klíč ve slotu číslo 9.
Toto je můj kód pro uzel Slave
#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"
#include "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#include "Wire.h"
// Knihovna ATECC608A
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#define ID_NODE 255
#define AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
Stav ATCA_STATUS;
Rádio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / brief Funkce spuštěná, když je nastaveno přerušení (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& data, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17,6; float brum = 16,4;
uint8_t data [16];
uint8_t cypherdata [16];
// Sestavením řetězce nastavíte veškerou moji hodnotu
// Každá hodnota je oddělena znakem "|" a „$“znamená konec dat // VAROVÁNÍ: Musí být kratší než 11 Řetězec tmp_str_data = Řetězec (ID_NODE) + "|" + Řetězec (teplota, 1) + "|" + Řetězec (hukot, 1) + "$"; // velikost 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (data, sizeof (data));
// Zašifrujte data
ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);
// vygenerování UUID na základě tří prvních čísel = ID uzel
String uuid = String (ID_NODE) + String (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)); // Přestaňte poslouchat radio.stopListening ();
bool rslt;
// Odeslání dat rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Začněte poslouchat radio.startListening (); if (rslt) {// Koncový a spánkový režim Serial.println (F ("Hotovo")); }}}}}
neplatné nastavení ()
{Serial.begin (9600);
// Spusťte konstruktor pro knihovnu
cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikace -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (výchozí hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Zpoždění probuzení (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); // Připojte přerušení na pin 3 // Upravte 1 pomocí O, pokud chcete přerušení na pinu 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
prázdná smyčka ()
{ // Není třeba }
Hlavní uzel
Hlavní uzel se probouzí každých 8 sekund, aby požádal data z podřízeného uzlu
Jak to funguje: Hlavní uzel pošle podřízenému paket „WakeUP“a po čekání odpověď podřízeného s daty.
V mém případě používám pole dvou int:
// Paket probuzení
const int wake_packet [2] = {20, 02};
Pokud uzel slave odešle paket ACK poté, co master odeslal paket WakeUp:
- Master nastaven v režimu poslouchat a čekat na komunikaci
- Pokud komunikace
- Extrahujte 8 prvních bajtů, lootujte tři první bajty z 8 bajtů, pokud se jedná o uzel ID
- Extrahujte 16 bajtů šifry
- Dešifrujte data
- Vytiskněte data v Serial
- Režim spánku
Pro šifrování AES používám klíč ve slotu číslo 9.
Toto je můj kód pro hlavní uzel
#include "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A library #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; Stav ATCA_STATUS; Rádio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // přerušení hlídacího psa ISR (WDT_vect) {wdt_disable (); // deaktivovat hlídacího psa} void sleepmode () {// deaktivovat ADC ADCSRA = 0; // vymazání různých příznaků "reset" MCUSR = 0; // povolit změny, zakázat reset WDTCSR = bit (WDCE) | bit (WDE); // nastavit režim přerušení a interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // nastavení WDIE a zpoždění 8 sekund wdt_reset (); // reset watchdog set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // časovaná sekvence následuje sleep_enable (); // vypnout aktivaci zhasnutí v softwaru MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); přerušení (); // zaručuje další provedenou instrukci sleep_cpu (); // preventivně zrušte spánek sleep_disable (); } neplatné nastavení () {Serial.begin (9600); // Spusťte konstruktor pro knihovnu cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikace -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (výchozí hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Zpoždění probuzení (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; // Odeslání dat rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Začněte poslouchat radio.startListening (); while (radio.available ()) {uint8_t odpověď [32]; radio.read (& odpověď, sizeof (odpověď)); uint8_t název_uzlu [3]; uint8_t šifra [16]; memcpy (id_uzlu, odpověď, 3); memcpy (šifra, odpověď + 3, 16); if ((int) node_id == ID_NODE) {uint8_t výstup [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Dešifrovaná data:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack not receive for Wakup Packet"); } // Režim spánku 8 sekund sleepmode (); }
Pokud máte otázku, jsem tu, abych vám odpověděl
Krok 4: 4. Pokračujte dále
Tento příklad je jednoduchý, takže můžete tento projekt vylepšit
Vylepšení:
- AES 128 je základní a můžete použít jiný algoritmus AES jako AES CBC, abyste byli bezpečnější.
- Změňte bezdrátový modul (NRF24L01 je omezen užitečným zatížením 23 bytů)
- …
Pokud vidíte zlepšení, vysvětlete to v diskusní oblasti
Krok 5: Závěr
Doufám, že vám tento článek bude užitečný. Omlouvám se, pokud jsem ve svém textu udělal chybu, ale angličtina není můj hlavní jazyk a mluvím lépe, než píšu.
Děkuji za přečtení všeho.
Užij si to.
Doporučuje:
Bezdrátová komunikace SmartHome: extrémní základy MQTT: 3 kroky
Bezdrátová komunikace SmartHome: extrémní základy MQTT: Základy MQTT: ** Budu dělat sérii domácí automatizace, projdu kroky, které jsem podnikl, abych se v budoucnu naučil vše, co jsem udělal. This Instructable is the baseline on how to setup MQTT for use in my future Instructables. Howeve
Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků
Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: Vytvářím knihovnu pro správu EBYTE E32 na základě řady zařízení LoRa Semtech, velmi výkonného, jednoduchého a levného zařízení. Verze 3 km zde, verze 8 km zde Mohou pracovat na vzdálenost 3000 m až 8 000 m a mají mnoho funkcí
Dlouhý dosah, 1,8 km, bezdrátová komunikace Arduino na Arduino s HC-12 .: 6 kroků (s obrázky)
Bezdrátová komunikace s dlouhým dosahem, 1,8 km, Arduino na Arduino S HC-12 .: V tomto návodu se naučíte, jak komunikovat mezi Arduinosem na dlouhé vzdálenosti až 1,8 km pod širým nebem. HC-12 je bezdrátový sériový port velmi užitečný, extrémně výkonný a snadno použitelný komunikační modul. Nejprve odejdete
Bezdrátová komunikace pomocí transceiverového modulu NRF24L01 pro projekty založené na Arduinu: 5 kroků (s obrázky)
Bezdrátová komunikace pomocí transceiverového modulu NRF24L01 pro projekty založené na Arduinu: Toto je můj druhý instruktážní tutoriál o robotech a mikrořadičích. Je opravdu úžasné vidět svého robota naživu a pracovat podle očekávání, a věřte mi, že bude zábavnější, když budete robota nebo jiné věci ovládat rychle a
Bezdrátová komunikace pomocí levných RF modulů 433 MHz a obrazových mikrokontrolérů. Část 2: 4 kroky (s obrázky)
Bezdrátová komunikace pomocí levných RF modulů 433 MHz a obrazových mikrokontrolérů. Část 2: V první části tohoto pokynu jsem demonstroval, jak naprogramovat PIC12F1822 pomocí kompilátoru MPLAB IDE a XC8, aby bezdrátově odeslal jednoduchý řetězec pomocí levných modulů TX/RX 433 MHz. Modul přijímače byl připojen přes USB k UART TTL kabelová reklama