Tartalomjegyzék:

Vezeték nélküli titkosított kommunikáció Arduino: 5 lépés
Vezeték nélküli titkosított kommunikáció Arduino: 5 lépés

Videó: Vezeték nélküli titkosított kommunikáció Arduino: 5 lépés

Videó: Vezeték nélküli titkosított kommunikáció Arduino: 5 lépés
Videó: Vezeték nélküli logikai analizátor v0.1.0 2024, November
Anonim
Vezeték nélküli titkosított kommunikáció Arduino
Vezeték nélküli titkosított kommunikáció Arduino

Üdv mindenkinek, Ebben a második cikkben elmagyarázom, hogyan használhatja az Atecc608a chipet a vezeték nélküli kommunikáció biztosításához. Ehhez az NRF24L01+ -t fogom használni a vezeték nélküli részhez és az Arduino UNO -t.

Az ATECC608A mikrochipet a MicroChip tervezte, és számos biztonsági eszközt kapott. Ez a chip például tárolhat ECC kulcsokat, AES kulcsokat (AES 128 esetén) és SHA2 hash -t.

A cikk: NRF24L01 + Arduino UNO + ATECC608A

Két IoT -objektum közötti kommunikáció során több támadás is előfordulhat: Man Of the enyhe, Információ másolása és egyebek. Tehát az elképzelésem nagyon egyszerű:

  1. Titkosított adatok felhasználása két vagy több IoT objektum között.
  2. Alacsony költségű kellékek
  3. Működhet egy Arduino UNO -val

Az én esetemben használom

  • az Atecc608a -t, hogy tárolja az AES kulcsomat, és titkosítsa/visszafejtse az adataimat.
  • az Arduino Uno mint mikrokontroller
  • Az NRF24L01 küldje el adataimat

Ehhez a projekthez kövesse az alábbi lépéseket:

  1. Állítsa be az ATECC608A chipet
  2. Végezze el az áramkört (főcsomópont és szolgacsomópont)
  3. Kódrész
  4. Menj tovább !

Az "ATECC608A chip beállítása" első lépésekhez írtam egy másik cikket, amely sorrendben ismerteti az egyes lépéseket. A link itt található:

Most kezdje!

Kellékek

Ehhez a projekthez szüksége van:

  • 2 Arduino UNO vagy Arduino NANO vagy Arduino Mega
  • Valami drót
  • 2 Atecc608a (mindegyik kevesebb, mint 0,60 USD)
  • 2 NRF24L01+
  • 2 kondenzátor (10 μF)
  • Kenyértáblák

Link a cikkemhez, amely elmagyarázza az ATECC608A chip beállítását -> Az Atecc608a beállítása

1. lépés: 1. Állítsa be az Atecc608a készüléket

1. Állítsa be az Atecc608a készüléket
1. Állítsa be az Atecc608a készüléket
1. Állítsa be az Atecc608a készüléket
1. Állítsa be az Atecc608a készüléket

Nem részletezem minden lépést, amelyet követni kell az ATECC608A beállításához, mert teljes cikket írtam, amely elmagyarázza az összes lépést. A beállításhoz kövesse a jelen cikk "4. lépését", amelynek címe "2. A chip konfigurálása (Atecc608a)"

A link a következő: Az ATECC608A beállítása

Ezenkívül ugyanazt a konfigurációt kell megadnia az Atecc608a, a master és a slave oldal esetében is, különben nem tudja visszafejteni az adatait

Figyelem:

Ennek a chipnek a beállításához sorban kell követnie a fenti cikk minden lépését. Ha egy lépés hiányzik, vagy a chip nincs lezárva, akkor nem tudja elvégezni ezt a projektet

Maradék:

Ehhez kövesse a következő lépéseket:

  • Hozzon létre egy konfigurációs sablont
  • Írja be ezt a sablont a chipbe
  • Zárja be a konfigurációs zónát
  • Írja be az AES -kulcsot (128 bit) egy nyílásba
  • Zárolja az adatzónát

2. lépés: 2. Az áramkör tervezése (Master és Slave)

2. Az áramkör tervezése (Master és Slave)
2. Az áramkör tervezése (Master és Slave)
2. Az áramkör tervezése (Master és Slave)
2. Az áramkör tervezése (Master és Slave)

Ebben a projektben lesz egy Master és egy Slave csomópont.

A fő csomópont a slave csomópont által küldött adatokat egyértelműen kinyomtatja. Minden X alkalommal adatokat fog kérni a slave csomóponttól.

A slave csomópont figyelni fogja a "hálózatot", és amikor "Request data" -t kap, előállítja, titkosítja és elküldi a master csomópontnak.

Mindkét oldalon a master és a slave áramkör ugyanaz:

  • Egy arduino Nano
  • Egy ATECC608A
  • Egy NRF24L01

Ehhez a lépéshez csatoltam az áramkört (lásd a fenti képet).

Az Arduino UNO ATECC608A esetében ez egy 8 tűs soic. Hozzáadtam a fenti "felülnézetet":

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

Az NRF24L01 esetében az Arduino -hoz:

  • 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) -> csak Slave csomóponthoz, Master módban nem használható

Miért érdemes használni az NRF24L01 IRQ csapját?

Az IRQ pin nagyon hasznos, ez a pin lehetővé teszi, hogy (LOW) azt mondja, amikor egy csomagot fogad az NRF24L01, így csatolhatunk egy megszakítást ehhez a pinhez, hogy felébresszük a slave csomópontot.

3. lépés: 3. a kód (Slave és Master)

3. a kódex (Slave és Master)
3. a kódex (Slave és Master)

Slave csomópont

Energiatakarékos módot használok a szolgacsomóponthoz, mert nem kell állandóan hallgatnia.

Hogyan működik: a slave csomópont hallgat és vár, amíg megkapja az "Wake UP" csomagot. Ezt a csomagot a Master csomópont küldi, hogy adatokat kérjen a slave -től.

Esetemben két int tömböt használok:

// Wake UP csomag

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

Ha csomópontom csomagot kap,

  1. felébred, olvassa el ezt a csomagot, ha a csomag "Wake UP",
  2. generálja az adatokat,
  3. titkosítja az adatokat,
  4. küldje el az adatokat a masternek, várjon egy ACK csomagot,
  5. alvás.

Az AES titkosításhoz kulcsot használok a 9 -es foglalatban.

Ez a Slave csomópont kódja

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

#include "SPI.h"

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

#include "Wire.h"

// ATECC608A könyvtár

#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 állapot;

RF24 rádió (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / rövid A megszakítás beállításakor végrehajtott funkció (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& adatok, 32); if (adatok [0] == 20 && adatok [1] == 02) {float temp = 17,6; float hum = 16,4;

uint8_t adatok [16];

uint8_t cypherdata [16];

// Hozzon létre egy karakterláncot az összes értékem beállításához

// Minden értéket "|" választ el és a "$" az adatok végét jelenti // FIGYELMEZTETÉS: 11 -nél rövidebb karakterláncnak kell lennie tmp_str_data = Karakterlánc (ID_NODE) + "|" + Karakterlánc (temp, 1) + "|" + Karakterlánc (zümmögés, 1) + "$"; // mérete 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (adatok, sizeof (adatok));

// Az adatok titkosítása

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

// UUID generálása a három első szám = azonosító csomópont alapján

Karakterlánc uuid = Karakterlánc (ID_NODE) + Karakterlánc (rand); // 8 -as méret

uint8_t tmp_uuid [8];

uint8_t data_to_send [32];

uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);

memcpy (adatok küldése, küldése, tmp_uuid, sizeof (tmp_uuid));

memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Ne hallgassa a rádiót.stopListening ();

bool rslt;

// Adatok küldése rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Rádióhallgatás indítása.startListening (); if (rslt) {// Vége és alvó mód Serial.println (F ("Kész")); }}}}}

üres beállítás ()

{Serial.begin (9600);

// Kezdd el a könyvtár konstruktorát

cfg.iface_type = ATCA_I2C_IFACE; // A kommunikáció típusa -> I2C mód cfg.devtype = ATECC608A; // A chip típusa cfg.atcai2c.slave_address = 0XC0; // I2C cím (alapértelmezett érték) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Ébredés késleltetése (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); // Csatlakoztassa a megszakítást a 3 -as érintkezőhöz // Módosítsa az 1 -t O -val, ha a megszakítást szeretné a 2 -es tűre // FALLING MODE = Pin a LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

üres hurok ()

{ // Nincs szükség }

Mestercsomópont

A főcsomópont 8 másodpercenként felébred, hogy adatokat kérjen a szolgacsomóponttól

Hogyan működik: A fő csomópont "WakeUP" csomagot küld a slave -nek, és várakozás után a slave válaszát adatokkal.

Esetemben két int tömböt használok:

// Wake UP csomag

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

Ha a slave csomópont ACK csomagot küld, miután a master elküldte a WakeUp csomagot:

  1. A mester állítsa be hallgatás üzemmódban, és várja meg a kommunikációt
  2. Ha a kommunikáció
  3. Bontsa ki a 8 első bájtot, és rabolja ki a 8 bájt három első bájtját, ha ez az azonosító csomópont
  4. Bontsa ki a 16 byte cypher -t
  5. Az adatok visszafejtése
  6. Nyomtassa ki az adatokat soros formában
  7. Alvó mód

Az AES titkosításhoz kulcsot használok a 9 -es foglalatban.

Ez a kódom a Master csomóponthoz

#include "Arduino.h"

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A könyvtár #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 állapot; RF24 rádió (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP csomag const int wake_packet [2] = {20, 02}; // watchdog interrupt ISR (WDT_vect) {wdt_disable (); // letiltja a watchdog} void sleepmode () {// letiltja az ADC ADCSRA = 0; // törli a különböző "reset" jelzőket MCUSR = 0; // változtatások engedélyezése, letiltás visszaállítása WDTCSR = bit (WDCE) | bit (WDE); // megszakítási mód és intervallum beállítása WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // WDIE beállítása, és 8 másodperc késleltetés wdt_reset (); // a watchdog set_sleep_mode (SLEEP_MODE_PWR_DOWN) visszaállítása; noInterrupts (); // az időzített sorozat a sleep_enable (); // a brown -out engedélyezés kikapcsolása a szoftverben MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); megszakítja (); // garantálja a következő végrehajtott utasítást sleep_cpu (); // elővigyázatosságból az alvás megszakítása sleep_disable (); } void setup () {Serial.begin (9600); // Indítsa el a könyvtár konstruktorát cfg.iface_type = ATCA_I2C_IFACE; // A kommunikáció típusa -> I2C mód cfg.devtype = ATECC608A; // A chip típusa cfg.atcai2c.slave_address = 0XC0; // I2C cím (alapértelmezett érték) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Ébredés késleltetése (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; // Adatok küldése rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Rádióhallgatás indítása.startListening (); while (radio.available ()) {uint8_t válasz [32]; radio.read (& válasz, sizeof (válasz)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, válasz, 3); memcpy (cifra, válasz + 3, 16); if ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS állapot = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (állapot == ATCA_SUCCESS) {Serial.println ("Visszafejtett adatok:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack not Receive for Wakup Packet"); } // Alvó mód 8 másodperces sleepmode (); }

Ha kérdésed van, itt vagyok, hogy válaszoljak

4. lépés: 4. Menjen tovább

Ez a példa egyszerű, így javíthatja ezt a projektet

Fejlesztések:

  • Az AES 128 alapvető, és az AES egy másik algoritmusát is használhatja AES CBC -ként, hogy biztonságosabb legyen.
  • Cserélje ki a vezeték nélküli modult (az NRF24L01 23 bájtos hasznos terheléssel korlátozott)

Ha lát javulást, magyarázza meg a vita területén

5. lépés: Következtetés

Remélem, hogy ez a cikk hasznos lesz az Ön számára. Elnézést, ha hibáztam a szövegben, de az angol nem a fő nyelvem, és jobban beszélek, mint írok.

Köszönöm, hogy mindent elolvastál.

Élvezd.

Ajánlott: