Sisällysluettelo:

Langaton salattu tiedonsiirto Arduino: 5 vaihetta
Langaton salattu tiedonsiirto Arduino: 5 vaihetta

Video: Langaton salattu tiedonsiirto Arduino: 5 vaihetta

Video: Langaton salattu tiedonsiirto Arduino: 5 vaihetta
Video: Start Using Wemos D1 Mini NodeMCU WiFi ESP8266 module with Arduino 2024, Marraskuu
Anonim
Langaton salattu tiedonsiirto Arduino
Langaton salattu tiedonsiirto Arduino

Hei kaikki, Tässä toisessa artikkelissa kerron sinulle, kuinka voit käyttää Atecc608a -sirua langattoman viestinnän suojaamiseen. Käytän tätä varten NRF24L01+ langattomassa osassa ja Arduino UNO: ssa.

MicroChip on suunnitellut mikrosirun ATECC608A ja saanut useita suojaustyökaluja. Tämä siru voi esimerkiksi tallentaa ECC -avaimet, AES -avaimet (AES 128) ja SHA2 -hajautus.

Artikkeli: NRF24L01 + Arduino UNO + ATECC608A

Kahden IoT -objektin välisen viestinnän aikana voi esiintyä useita hyökkäyksiä: Man Of the mild, Copy of information ja paljon muuta. Ideani on siis hyvin yksinkertainen:

  1. Salatun datan hyödyntäminen kahden tai useamman IoT -objektin välillä.
  2. Edulliset tarvikkeet
  3. Voi työskennellä Arduino UNO: n kanssa

Minun tapauksessani käytän

  • Atecc608a AES -avaimen tallentamiseen ja tietojen salaamiseen/salauksen purkamiseen.
  • Arduino Uno mikrokontrollerina
  • NRF24L01 lähettää tietoni

Sinun on noudatettava näitä ohjeita tässä projektissa:

  1. Aseta siru ATECC608A
  2. Tee piiri (pääsolmu ja orjasolmu)
  3. Koodiosa
  4. Mennä pidemmälle !

Ensimmäisiin vaiheisiin "Asenna siru ATECC608A" kirjoitin toisen artikkelin, joka selittää jokaisen vaiheen järjestyksessä. Linkki on täällä:

Aloita nyt!

Tarvikkeet

Tätä projektia varten tarvitset:

  • 2 Arduino UNO tai Arduino NANO tai Arduino Mega
  • Joku lanka
  • 2 Atecc608a (jokainen maksaa alle 0,60 $)
  • 2 NRF24L01+
  • 2 kondensaattoria (10 μF)
  • Leipälaudat

Linkki artikkeliini, jossa kerrotaan, kuinka ATECC608A -siru asetetaan -> Atecc608a: n käyttöönotto

Vaihe 1: 1. Asenna Atecc608a

1. Asenna Atecc608a
1. Asenna Atecc608a
1. Asenna Atecc608a
1. Asenna Atecc608a

En kerro yksityiskohtia ATECC608A: n asentamisessa noudatettavista vaiheista, koska kirjoitin täydellisen artikkelin, joka selittää kaikki vaiheet sen tekemiseksi. Voit ottaa sen käyttöön noudattamalla tämän artikkelin "Vaihetta 4" nimeltä "2. Sirun määritys (Atecc608a)"

Linkki on: Kuinka asentaa ATECC608A

Sinun on myös asetettava sama kokoonpano Atecc608a: lle, isäntäpuolelle ja orjapuolelle, muuten et voi purkaa tietojasi

Varoitus:

Tämän sirun asentamiseksi sinun on noudatettava yllä olevan artikkelin kaikkia vaiheita järjestyksessä. Jos yksi vaihe puuttuu tai siru ei ole lukossa, et voi tehdä tätä projektia

Loput:

Toimi näin:

  • Luo määritysmalli
  • Kirjoita tämä malli sirulle
  • Lukitse Config Zone
  • Kirjoita AES -avaimesi (128 bittiä) paikkaan
  • Lukitse tietoalue

Vaihe 2: 2. Piirin suunnittelu (isäntä ja orja)

2. Piirin suunnittelu (isäntä ja orja)
2. Piirin suunnittelu (isäntä ja orja)
2. Piirin suunnittelu (isäntä ja orja)
2. Piirin suunnittelu (isäntä ja orja)

Tässä projektissa sinulla on isäntäsolmu ja orjasolmu.

Pääsolmu tulostaa orjasolmun lähettämät tiedot selkeästi. Se pyytää tietoja orjasolmulta joka X kerta.

Orjasolmu kuuntelee "verkkoa" ja kun se vastaanottaa "pyyntötiedot", se luo sen, salaa sen ja lähettää sen pääsolmulle.

Molemmilla puolilla isäntä- ja orjapiiri ovat samat:

  • Yksi arduino Nano
  • Yksi ATECC608A
  • Yksi NRF24L01

Liitin piirin tähän vaiheeseen (ks. Kuva yllä).

Arduino UNO: lle ATECC608A: lle tämä on 8 -nastainen soic. Lisäsin yllä olevan "ylhäältä":

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

NRF24L01 Arduinolle:

  • 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) -> vain orjasolmulle, ei käytetä isäntätilassa

Miksi käyttää NRF24L01: n IRQ -tappia?

IRQ -nasta on erittäin hyödyllinen, tämä nasta antaa mahdollisuuden sanoa (LOW), kun NRF24L01 vastaanottaa paketin, joten voimme liittää tähän keskeytykseen herättääksesi orjasolmun.

Vaihe 3: 3. koodi (orja ja isäntä)

3. koodi (orja ja isäntä)
3. koodi (orja ja isäntä)

Orjasolmu

Käytän orjasolmun virransäästöä, koska sen ei tarvitse kuunnella koko ajan.

Näin se toimii: orjasolmu kuuntele ja odota, että se vastaanottaa "Wake UP -paketin". Pääsolmu lähettää tämän paketin pyytääkseen tietoja orjalta.

Minun tapauksessani käytän taulukkoa kahdesta int:

// Herätyspaketti

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

Jos solmuni vastaanottaa paketin,

  1. se herää, lue tämä paketti, jos paketti on "Herää",
  2. se tuottaa dataa,
  3. salata tiedot,
  4. lähettää tiedot päälaitteelle, odottaa ACK -pakettia,
  5. nukkua.

AES -salauksessa käytän avainta numerossa 9.

Tämä on Slave -solmuni koodi

#Sisällytä "Arduino.h" #Sisällytä "avr/sleep.h" #Sisällytä "avr/wdt.h"

#include "SPI.h"

#Sisällytä "nRF24L01.h" #Sisällytä "RF24.h"

#sisältää "Wire.h"

// ATECC608A -kirjasto

#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 -tila;

RF24 -radio (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / lyhyt Toiminto suoritetaan, kun keskeytys on asetettu (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; kelluva hum = 16,4;

uint8_t -tiedot [16];

uint8_t cypherdata [16];

// Luo merkkijono kaiken arvon määrittämiseksi

// Jokainen arvo erotetaan "|" - merkillä ja "$" tarkoittaa datan loppua // VAROITUS: Pitää olla alle 11 pituinen merkkijono tmp_str_data = Jono (ID_NODE) + "|" + Merkkijono (lämpötila, 1) + "|" + Jono (hum, 1) + "$"; // koko 11 Serial.println ("tmp_str_data:" + tmp_str_data);

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

// Salaa tiedot

ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); jos (tila == ATCA_SUCCESS) {pitkä rand = satunnainen ((pitkä) 10000, (pitkä) 99999);

// Luo UUID kolmen ensimmäisen numeron = ID -solmun perusteella

Jono uuid = Jono (ID_NODE) + Jono (rand); // Koko 8

uint8_t tmp_uuid [8];

uint8_t data_to_dend [32];

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

muisti (data_to_send, tmp_uuid, sizeof (tmp_uuid));

muisti (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Lopeta radion kuuntelu.stopListening ();

bool rslt;

// Lähetä tiedot rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Aloita radion kuuntelu.startListening (); if (rslt) {// Lopetus- ja lepotila Serial.println (F ("Valmis")); }}}}}

mitätön asennus ()

{Serial.begin (9600);

// Aloita kirjaston suunnittelija

cfg.iface_type = ATCA_I2C_IFACE; // Tiedonsiirtotyyppi -> I2C -tila cfg.devtype = ATECC608A; // Sirun tyyppi cfg.atcai2c.slave_address = 0XC0; // I2C -osoite (oletusarvo) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Herätyksen viive (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); // Liitä keskeytys nastaan 3 // Muokkaa 1 O: lla, jos haluat keskeytyksen nastalle 2 // FALLING MODE = Nasta LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

tyhjä silmukka ()

{ // Ei tarvetta }

Pääsolmu

Pääsolmu herää 8 sekunnin välein pyytääkseen tietoja orjasolmulta

Näin se toimii: Pääsolmu lähettää "WakeUP" -paketin orjalle ja odotuksen jälkeen orjan vastauksen tiedoineen.

Minun tapauksessani käytän kahden joukon int:

// Herätyspaketti

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

Jos orjasolmu lähettää ACK -paketin sen jälkeen, kun isäntä on lähettänyt WakeUp -paketin:

  1. Pääasennus kuuntelutilassa ja odota viestintää
  2. Jos viestintä
  3. Pura 8 ensimmäinen tavu, ryöstä 8 tavun kolme ensimmäistä tavua, jos tämä on ID -solmu
  4. Pura 16 tavun salaus
  5. Pura tiedot
  6. Tulosta tiedot sarjassa
  7. Nukkumismoodi

AES -salauksessa käytän avainta numerossa 9.

Tämä on koodini isäntäsolmulle

#Sisällytä "Arduino.h"

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A -kirjasto #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 -tila; RF24 -radio (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Herätyspaketti const int wake_packet [2] = {20, 02}; // vahtikoira keskeyttää ISR (WDT_vect) {wdt_disable (); // disable watchdog} void sleepmode () {// poista ADC ADCSRA = 0; // tyhjennä erilaiset "nollaus" -liput MCUSR = 0; // salli muutokset, poista nollaus käytöstä WDTCSR = bit (WDCE) | bitti (WDE); // aseta keskeytystila ja väli WDTCSR = bit (WDIE) | bitti (WDP3) | bitti (WDP0); // aseta WDIE ja 8 sekunnin viive wdt_reset (); // nollaa vahtikoira set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // ajoitettu sekvenssi seuraa sleep_enable (); // poista brown -out -toiminto käytöstä ohjelmistossa MCUCR = bit (BODS) | bitti (BODSE); MCUCR = bitti (BODS); keskeyttää (); // takaa seuraavan käskyn suorittamisen sleep_cpu (); // peruuta uni varotoimena sleep_disable (); } void setup () {Serial.begin (9600); // Aloita kirjaston konstruktori cfg.iface_type = ATCA_I2C_IFACE; // Tiedonsiirtotyyppi -> I2C -tila cfg.devtype = ATECC608A; // Sirun tyyppi cfg.atcai2c.slave_address = 0XC0; // I2C -osoite (oletusarvo) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Herätyksen viive (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; // Lähetä tiedot rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Aloita radion kuuntelu.startListening (); while (radio.available ()) {uint8_t vastaus [32]; radio.read (& vastaus, sizeof (vastaus)); uint8_t node_id [3]; uint8_t salaus [16]; muisti (solmun_tunnus, vastaus, 3); muisti (salaus, vastaus + 3, 16); if ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, salaus, 16, lähtö, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Salatut tiedot:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ei saa Wakup -paketista"); } // Lepotila 8 sekuntia lepotila (); }

Jos sinulla on kysyttävää, olen täällä vastaamassa

Vaihe 4: 4. Mene pidemmälle

Tämä esimerkki on yksinkertainen, joten voit parantaa tätä projektia

Parannuksia:

  • AES 128 on perus, ja voit käyttää toista AES -algoritmia AES CBC -laitteena turvallisemmaksi.
  • Vaihda langaton moduuli (NRF24L01 on rajoitettu 23 tavun hyötykuormalla)

Jos näet parannettavaa, selitä se keskustelualueella

Vaihe 5: Johtopäätös

Toivottavasti tästä artikkelista on sinulle hyötyä. Anteeksi, jos tein virheen tekstissäni, mutta englanti ei ole pääkieleni ja puhun paremmin kuin kirjoitan.

Kiitos, että luit kaiken.

Nauti siitä.

Suositeltava: