Obsah:

Bezdrátová šifrovaná komunikace Arduino: 5 kroků
Bezdrátová šifrovaná komunikace Arduino: 5 kroků

Video: Bezdrátová šifrovaná komunikace Arduino: 5 kroků

Video: Bezdrátová šifrovaná komunikace Arduino: 5 kroků
Video: ANDROID MÁ JEDNO SKRYTÉ NASTAVENÍ 🤖 2024, Listopad
Anonim
Bezdrátová šifrovaná komunikace Arduino
Bezdrátová šifrovaná komunikace Arduino

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á:

  1. Využití šifrovaných dat mezi dvěma nebo více objekty IoT.
  2. Nízké náklady na dodávky
  3. 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:

  1. Nastavte čip ATECC608A
  2. Proveďte zapojení (hlavní uzel a podřízený uzel)
  3. Část kódu
  4. 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

1. Nastavte Atecc608a
1. Nastavte Atecc608a
1. Nastavte Atecc608a
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ý)

2. Návrh obvodu (hlavní a podřízený)
2. Návrh obvodu (hlavní a podřízený)
2. Návrh obvodu (hlavní a podřízený)
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)

3. Kód (Slave a Master)
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,

  1. probuď se, přečti si tento paket, pokud je paket „Wake UP“,
  2. generuje data,
  3. zašifrovat data,
  4. poslat data masteru, počkat na ACK paket,
  5. 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:

  1. Master nastaven v režimu poslouchat a čekat na komunikaci
  2. Pokud komunikace
  3. Extrahujte 8 prvních bajtů, lootujte tři první bajty z 8 bajtů, pokud se jedná o uzel ID
  4. Extrahujte 16 bajtů šifry
  5. Dešifrujte data
  6. Vytiskněte data v Serial
  7. 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: