Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Tere kõigile, Selles teises artiklis selgitan teile, kuidas kasutada kiipi Atecc608a traadita side tagamiseks. Selleks kasutan traadita osa jaoks NRF24L01+ ja Arduino UNO.
Mikrokiip ATECC608A on kujundanud MicroChip ja sellel on mitu turvatööriista. Näiteks võib see kiip salvestada ECC -võtmeid, AES -võtmeid (AES 128 jaoks) ja SHA2 -räsivõtmeid.
Artikkel: NRF24L01 + Arduino UNO + ATECC608A
Kahe IoT -objekti vahelise suhtluse ajal võib esineda mitmeid rünnakuid: Man Of the mild, teabe koopia ja palju muud. Seega on minu idee väga lihtne:
- Krüptitud andmete kasutamine kahe või enama IoT -objekti vahel.
- Madala hinnaga tarned
- Saab töötada Arduino UNO -ga
Minu puhul kasutan
- Atecc608a minu AES -võtme salvestamiseks ja minu andmete krüptimiseks/dekrüpteerimiseks.
- Arduino Uno kui mikrokontroller
- NRF24L01 minu andmete saatmiseks
Selle projekti jaoks peate järgima neid samme:
- Seadistage kiip ATECC608A
- Tehke vooluring (põhisõlm ja orjasõlm)
- Koodi osa
- Mine edasi !
Esimeste sammude "Kiibi ATECC608A seadistamine" jaoks kirjutasin teise artikli, mis selgitab iga sammu järjekorras. Link on siin:
Nüüd alustage!
Tarvikud
Selle projekti jaoks vajate:
- 2 Arduino UNO või Arduino NANO või Arduino Mega
- Mingi traat
- 2 Atecc608a (igaüks maksab vähem kui 0,60 dollarit)
- 2 NRF24L01+
- 2 kondensaatorit (10 μF)
- Paneelid
Link minu artiklile, mis selgitab kiibi ATECC608A seadistamist -> Kuidas seadistada Atecc608a
Samm 1: 1. Seadistage Atecc608a
Ma ei räägi üksikasjalikult igast sammust, mida ATECC608A seadistamisel järgida, sest kirjutasin täieliku artikli, mis selgitab kõiki selle tegemise samme. Selle seadistamiseks peate järgima selle artikli 4. sammu nimega "2. Kiibi konfiguratsioon (Atecc608a)"
Link on järgmine: kuidas seadistada ATECC608A
Samuti peate seadistama sama konfiguratsiooni Atecc608a, ülem- ja alampool, vastasel juhul ei saa te oma andmeid dekrüpteerida
Hoiatus:
Selle kiibi seadistamiseks peate järgima ülaltoodud artikli kõiki samme. Kui üks samm on puudu või kiip pole lukus, ei saaks te seda projekti teha
Ülejäänud:
Selleks järgige järgmist sammu:
- Looge konfiguratsioonimall
- Kirjutage see mall kiibile
- Lukustage konfiguratsioonitsoon
- Kirjutage oma AES -võti (128 bitti) pessa
- Andmetsooni lukustamine
2. etapp: 2. Vooluahela projekteerimine (Master ja Slave)
Selles projektis on teil peasõlm ja orjasõlm.
Põhisõlm prindib orjasõlme saadetud andmed selgeks. See küsib orjasõlmelt andmeid iga X kord.
Alasõlm kuulab "võrku" ja kui ta saab "päringu andmed", genereerib selle, krüpteerib ja saadab põhisõlme.
Mõlema poole jaoks on ahela juht ja alam sama:
- Üks arduino Nano
- Üks ATECC608A
- Üks NRF24L01
Selle sammu külge ühendasin ahela (vt ülaltoodud pilti).
Arduino UNO ATECC608A jaoks on see 8 -kontaktiline. Lisasin ülal "pealtvaate":
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
NRF24L01 jaoks Arduino jaoks:
- 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) -> ainult orjasõlme jaoks, ei kasutata põhirežiimis
Miks kasutada NRF24L01 IRQ tihvti?
IRQ -tihvt on väga kasulik, see nööpnõel võimaldab öelda (LOW), kui NRF24L01 võtab vastu paketi, nii et me saame sellele tihvtile lisada katkestuse, et äratada alam -sõlm.
3. samm: 3. kood (ori ja kapten)
Orjasõlm
Ma kasutan orjasõlme jaoks energiasäästu, kuna see ei pea kogu aeg kuulama.
Kuidas see toimib: orjasõlm kuulab ja ootab "Wake UP paketti". Selle paketi saadab peasõlm orjalt andmeid küsima.
Minu puhul kasutan massiivi kahest int:
// Äratuspakett
const int wake_packet [2] = {20, 02};
Kui minu sõlm saab paketi,
- kui see ärkab, lugege seda paketti, kui pakett on "Wake UP",
- see genereerib andmeid,
- andmed krüptida,
- saatke andmed kaptenile, oodake ACK -paketti,
- magama.
AES -krüptimiseks kasutan võtit pesa numbris 9.
See on minu Slave sõlme kood
#sisalda "Arduino.h" #sisalda "avr/sleep.h" #sisalda "avr/wdt.h"
#include "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#include "Wire.h"
// ATECC608A raamatukogu
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#define ID_NODE 255
#define AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
Olek ATCA_STATUS;
Raadio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / lühifunktsioon täidetakse, kui katkestus on seatud (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& andmed, 32); if (andmed [0] == 20 && andmed [1] == 02) {float temp = 17,6; ujukihin = 16,4;
uint8_t andmed [16];
uint8_t cypherdata [16];
// Ehitage string, et määrata kogu minu väärtus
// Iga väärtus on eraldatud "|" ja "$" tähendab andmete lõppu // HOIATUS: peab olema väiksem kui 11 pikkune string tmp_str_data = String (ID_NODE) + "|" + String (temp, 1) + "|" + String (ümin, 1) + "$"; // suurus 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (andmed, suurus (andmed));
// Andmete krüptimine
ATCA_STATUS olek = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); kui (olek == ATCA_SUCCESS) {pikk rand = juhuslik ((pikk) 10000, (pikk) 99999);
// genereerige UUID kolme esimese numbri = ID sõlme põhjal
String uuid = String (ID_NODE) + string (rand); // Suurus 8
uint8_t tmp_uuid [8];
uint8_t andmed_saatmiseks [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (andmed_saatmiseks, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Lõpeta raadio kuulamine.stopListening ();
bool rslt;
// Andmete saatmine rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Alusta raadio kuulamist.startListening (); if (rslt) {// Lõpp- ja unerežiim Serial.println (F ("Valmis")); }}}}}
tühine seadistus ()
{Serial.begin (9600);
// Initsiatiiv raamatukogu jaoks
cfg.iface_type = ATCA_I2C_IFACE; // Side tüüp -> I2C režiim cfg.devtype = ATECC608A; // Kiibi tüüp cfg.atcai2c.slave_address = 0XC0; // I2C -adressaat (vaikeväärtus) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Äratuse viivitus (1500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); raadio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Kinnita katkestus tihvtile 3 // Muuda 1 O -ga, kui soovid katkestust tihvtile 2 // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
tühine tsükkel ()
{ // Pole tarvis }
Põhisõlm
Põhisõlm ärkab iga 8 sekundi järel, et küsida andmeid orjasõlmelt
Kuidas see toimib: peasõlm saadab orjale paketi "WakeUP" ja pärast ootamist alamvastus andmetega.
Minu puhul kasutan massiivi kahest int:
// Äratuspakett
const int wake_packet [2] = {20, 02};
Kui orjasõlm saadab ACK -paketi pärast seda, kui kapten on saatnud WakeUp -paketi:
- Meister seadistage kuulamisrežiimis ja oodake suhtlust
- Kui suhtlemine
- Väljavõte 8 esimest baiti, rüüstata 8 baiti kolm esimest baiti, kui see on ID -sõlm
- Väljavõte 16 baiti cypher
- Andmete dekrüpteerimine
- Printige andmed seeriaviisiliselt
- Puhkerežiim
AES -krüptimiseks kasutan võtit pesa numbris 9.
See on minu põhisõlme kood
#sisaldab "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A raamatukogu #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; Olek ATCA_STATUS; Raadio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP pakett const int wake_packet [2] = {20, 02}; // valvekoera katkestus ISR (WDT_vect) {wdt_disable (); // disable watchdog} void sleepmode () {// keela ADC ADCSRA = 0; // tühjendage erinevad "lähtestamise" lipud MCUSR = 0; // lubada muudatusi, keelata lähtestamine WDTCSR = bit (WDCE) | bit (WDE); // määrake katkestusrežiim ja intervall WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // määrake WDIE ja viivitage 8 sekundit wdt_reset (); // lähtestage valvekoer set_sleep_mode (SLEEP_MODE_PWR_DOWN); noKatkestused (); // ajastatud jada järgneb sleep_enable (); // lülita pruuni väljalülitamise funktsioon tarkvaras välja MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); katkestab (); // garanteerib järgmise käsu täitmise sleep_cpu (); // tühistada uni ettevaatusabinõuna sleep_disable (); } void setup () {Serial.begin (9600); // Teeki konstrueerija algatamine cfg.iface_type = ATCA_I2C_IFACE; // Side tüüp -> I2C režiim cfg.devtype = ATECC608A; // Kiibi tüüp cfg.atcai2c.slave_address = 0XC0; // I2C -adressaat (vaikeväärtus) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Äratuse viivitus (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); raadio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Andmete saatmine rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Alusta raadio kuulamist.startListening (); while (raadio. saadaval ()) {uint8_t vastus [32]; radio.read (& vastus, sizeof (vastus)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (sõlme ID, vastus, 3); memcpy (šifr, vastus + 3, 16); if ((int) node_id == ID_NODE) {uint8_t väljund [16]; ATCA_STATUS olek = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (olek == ATCA_SUCCESS) {Serial.println ("Dekrüpteeritud andmed:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Äratuspaketi eest ei saa saada"); } // Unerežiim 8 sekundit unerežiim (); }
Kui teil on küsimusi, olen siin, et vastata
4. samm: 4. Minge kaugemale
See näide on lihtne, nii et saate seda projekti täiustada
Parandused:
- AES 128 on põhiline ja turvalisuse huvides saate AES CBC -na kasutada mõnda muud AES -i algoritmi.
- Muutke traadita ühenduse moodulit (NRF24L01 on piiratud 23 -bitise kandevõimega)
- …
Kui näete parandamist, selgitage seda arutelualal
5. samm: järeldus
Loodan, et see artikkel on teile kasulik. Vabandust, kui tegin oma tekstis vea, kuid inglise keel pole minu peamine keel ja räägin paremini kui kirjutan.
Täname, et lugesite kõike.
Naudi seda.