Obsah:

Bezdrôtová šifrovaná komunikácia Arduino: 5 krokov
Bezdrôtová šifrovaná komunikácia Arduino: 5 krokov

Video: Bezdrôtová šifrovaná komunikácia Arduino: 5 krokov

Video: Bezdrôtová šifrovaná komunikácia Arduino: 5 krokov
Video: Android - Bluetooth (zapnutie adaptéra) 2024, November
Anonim
Bezdrôtová šifrovaná komunikácia Arduino
Bezdrôtová šifrovaná komunikácia Arduino

Ahojte všetci, V tomto druhom článku vám vysvetlím, ako používať čip Atecc608a na zabezpečenie vašej bezdrôtovej komunikácie. Na tento účel použijem NRF24L01+ pre bezdrôtovú časť a Arduino UNO.

Mikročip ATECC608A bol navrhnutý spoločnosťou MicroChip a dostal viacero bezpečnostných nástrojov. Tento čip môže napríklad uchovávať kľúče ECC, AES (pre AES 128) a SHA2 Hash.

Článok: NRF24L01 + Arduino UNO + ATECC608A

Počas komunikácie medzi dvoma objektmi IoT môže existovať viacero útokov: muž mierneho typu, kópia informácií a ďalšie.. Moja predstava je teda veľmi jednoduchá:

  1. Využitie šifrovaných údajov medzi dvoma alebo viacerými objektmi IoT.
  2. Nízke náklady na zásoby
  3. Môže pracovať s Arduino UNO

V mojom prípade používam

  • Atecc608a na uloženie môjho kľúča AES a na šifrovanie/dešifrovanie mojich údajov.
  • Arduino Uno ako mikrokontrolér
  • NRF24L01 na odoslanie mojich údajov

Pri tomto projekte musíte vykonať tieto kroky:

  1. Nastavte čip ATECC608A
  2. Vykonajte obvod (hlavný uzol a podradený uzol)
  3. Časť kódu
  4. Pokračuj !

K prvým krokom „Nastavenie čipu ATECC608A“som napísal ďalší článok, ktorý vysvetľuje každý krok v poradí. Odkaz je tu:

Teraz začnite!

Zásoby

Na tento projekt potrebujete:

  • 2 Arduino UNO alebo Arduino NANO alebo Arduino Mega
  • Nejaký drôt
  • 2 Atecc608a (každý stál menej ako 0,60 $)
  • 2 NRF24L01+
  • 2 kondenzátor (10 μF)
  • Breadboards

Odkaz na môj článok, ktorý vysvetľuje, ako nastaviť čip ATECC608A -> Ako nastaviť Atecc608a

Krok 1: 1. Nastavte Atecc608a

1. Nastavte Atecc608a
1. Nastavte Atecc608a
1. Nastavte Atecc608a
1. Nastavte Atecc608a

Nebudem podrobne popisovať každý krok, ktorý je potrebné dodržať pri nastavovaní ATECC608A, pretože som napísal celý článok, ktorý vysvetľuje všetky kroky, ako to urobiť. Ak ho chcete nastaviť, musíte postupovať podľa „Krok 4“tohto článku s názvom „2. Konfigurácia čipu (Atecc608a)“

Odkaz je: Ako nastaviť ATECC608A

Tiež musíte vložiť rovnakú konfiguráciu pre Atecc608a, nadradenú a podradenú stranu, inak nebudete môcť dešifrovať svoje údaje

Pozor:

Ak chcete nastaviť tento čip, musíte v poriadku vykonať všetky kroky vyššie uvedeného článku. Ak chýba jeden krok alebo čip nie je zablokovaný, tento projekt by ste nemohli vykonať

Zvyšok:

K tomu je potrebné dodržať nasledujúci krok:

  • Vytvorte konfiguračnú šablónu
  • Napíšte túto šablónu na čip
  • Uzamknite konfiguračnú zónu
  • Napíšte svoj AES kľúč (128 bitov) do slotu
  • Uzamknite dátovú zónu

Krok 2: 2. Návrh obvodu (hlavný a podriadený)

2. Návrh obvodu (hlavný a podriadený)
2. Návrh obvodu (hlavný a podriadený)
2. Návrh obvodu (hlavný a podriadený)
2. Návrh obvodu (hlavný a podriadený)

V tomto projekte budete mať hlavný uzol a podradený uzol.

Hlavný uzol vytlačí údaje odoslané podriadeným uzlom ako čisté. Bude vyžadovať údaje z podradeného uzla každých X -krát.

Podradený uzol bude počúvať „sieť“a keď prijme „Požiadať o údaje“, vygeneruje ich, zašifruje a odošle do hlavného uzla.

Okruh Master a Slave je na oboch stranách rovnaký:

  • Jedno arduino Nano
  • Jeden ATECC608A
  • Jeden NRF24L01

K tomuto kroku som pripojil obvod (porovnaj obrázok vyššie).

Pre ATECC608A k Arduino UNO je to 8 pinov soic. Vyššie som pridal „pohľad zhora“:

  • ARDUINO 3.3V -> PIN 8 (Atecc608a)
  • ARDUINO GND -> PIN 4 (Atecc608a)
  • ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  • ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Pre NRF24L01 pre 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) -> iba pre podradený uzol, nepoužíva sa v režime Master

Prečo používať pin IRQ na NRF24L01

PIN IRQ je veľmi užitočný. Tento pin umožňuje povedať (LOW), keď je NRF24L01 prijatý paket, takže k tomuto pinu môžeme pripojiť prerušenie, aby sa prebudil podradený uzol.

Krok 3: 3. Kód (Slave a Master)

3. Kód (Slave a Master)
3. Kód (Slave a Master)

Slave uzol

Na podradený uzol používam úsporu energie, pretože nepotrebuje neustále počúvať.

Ako to funguje: podradený uzol počúva a čaká na prijatie paketu „Wake UP“. Tento paket odosiela hlavný uzol na vyžiadanie údajov od zariadenia slave.

V mojom prípade používam pole dvoch int:

// Paket prebudenia

const int wake_packet [2] = {20, 02};

Ak môj uzol dostane paket,

  1. prebuďte sa, prečítajte si tento paket, ak je paket „Wake UP“,
  2. generuje údaje,
  3. zašifrovať údaje,
  4. pošlite údaje kapitánovi, počkajte na paket ACK,
  5. spať.

Na šifrovanie AES používam kľúč v slote číslo 9.

Toto je môj kód pre uzol Slave

#include "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"

#include "SPI.h"

#include "nRF24L01.h" #include "RF24.h"

#include "Wire.h"

// kniž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;

Stav ATCA_STATUS;

Rádio RF24 (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / brief Funkcia sa vykoná, keď je nastavené prerušenie (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; plavákový hukot = 16,4;

uint8_t údaje [16];

uint8_t cypherdata [16];

// Vytvorením reťazca nastavíte celú moju hodnotu

// Každá hodnota je oddelená znakom "|" a „$“znamená koniec údajov // UPOZORNENIE: Musí mať dĺžku menšiu ako 11 reťazcov tmp_str_data = String (ID_NODE) + "|" + Reťazec (teplota, 1) + "|" + Reťazec (hukot, 1) + "$"; // veľkosť 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (údaje, sizeof (údaje));

// Zašifrujte údaje

ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);

// vygenerovanie UUID na základe troch prvých čísel = uzol ID

String uuid = String (ID_NODE) + String (rand); // Veľkosť 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)); // Prestaňte počúvať radio.stopListening ();

bool rslt;

// Odoslanie údajov rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Začnite počúvať radio.startListening (); if (rslt) {// Režim ukončenia a spánku Serial.println (F („Hotovo“)); }}}}}

neplatné nastavenie ()

{Serial.begin (9600);

// Spustenie konfigurátora knižnice

cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikácie -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (predvolená hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oneskorenie prebudenia (1 500 ms) cfg.rx_retries = 20;

radio.begin ();

radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setObjednávky (5, 5);

radio.openWritingPipe (masteraddresse);

radio.openReadingPipe (1, slaveaddresse); // Pripojenie prerušenia k pinu 3 // Upravte 1 o O, ak chcete prerušenie k pinu 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

prázdna slučka ()

{ // Netreba }

Hlavný uzol

Hlavný uzol sa prebúdza každých 8 sekúnd, aby vyžiadal údaje z podradeného uzla

Ako to funguje: Hlavný uzol pošle paketu „WakeUP“do podriadeného zariadenia a po čakaní na odpoveď podriadeného zariadenia s údajmi.

V mojom prípade používam pole dvoch int:

// Paket prebudenia

const int wake_packet [2] = {20, 02};

Ak uzol slave odošle paket ACK potom, čo master odoslal paket WakeUp:

  1. Master nastavený v režime počúvania a čakajte na komunikáciu
  2. Ak komunikácia
  3. Extrahujte 8 prvých bajtov, vyrabujte tri prvé bajty z 8 bajtov, ak ide o uzol ID
  4. Extrahujte 16 bajtov šifry
  5. Dešifrujte údaje
  6. Vytlačte údaje v sérii
  7. Spánkový režim

Na šifrovanie AES používam kľúč v slote číslo 9.

Toto je môj kód pre hlavný uzol

#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; // Paket Wake UP const int wake_packet [2] = {20, 02}; // prerušenie strážneho psa ISR (WDT_vect) {wdt_disable (); // vypnúť strážneho psa} void sleepmode () {// vypnúť ADC ADCSRA = 0; // vymazanie rôznych vlajok "reset" MCUSR = 0; // povoliť zmeny, zakázať reset WDTCSR = bit (WDCE) | bit (WDE); // nastavenie režimu prerušenia a interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // nastavenie WDIE a oneskorenie 8 sekúnd wdt_reset (); // reset strážneho psa set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // časovaná sekvencia nasleduje sleep_enable (); // vypnutie vypínania v softvéri MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); prerušenia (); // garantuje vykonanie ďalšej inštrukcie sleep_cpu (); // preventívne zrušte spánok sleep_disable (); } neplatné nastavenie () {Serial.begin (9600); // Spustenie konfigurátora knižnice cfg.iface_type = ATCA_I2C_IFACE; // Typ komunikácie -> režim I2C cfg.devtype = ATECC608A; // Typ čipu cfg.atcai2c.slave_address = 0XC0; // adresa I2C (predvolená hodnota) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oneskorenie prebudenia (1 500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setObjednávky (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Odoslanie údajov rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Začnite počúvať radio.startListening (); while (radio.available ()) {uint8_t odpoveď [32]; radio.read (& odpoveď, sizeof (odpoveď)); uint8_t node_id [3]; uint8_t šifra [16]; memcpy (node_id, odpoveď, 3); memcpy (šifra, odpoveď + 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é údaje:"); 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 sekúnd režim spánku (); }

Ak máte otázku, som tu, aby som vám odpovedal

Krok 4: 4. Choďte ďalej

Tento príklad je jednoduchý, takže môžete tento projekt vylepšiť

Vylepšenia:

  • AES 128 je základný a môžete použiť aj iný algoritmus AES ako AES CBC, aby bol bezpečnejší.
  • Zmeňte bezdrôtový modul (NRF24L01 je obmedzený užitočným zaťažením 23 bytov)

Ak vidíte zlepšenie, vysvetlite to v diskusnej oblasti

Krok 5: Záver

Dúfam, že tento článok bude pre vás užitočný. Ospravedlňujeme sa, ak som sa vo svojom texte zmýlil, ale angličtina nie je môj hlavný jazyk a hovorím lepšie, ako píšem.

Ďakujem, že ste si všetko prečítali.

Uži si to.

Odporúča: