Tartalomjegyzék:
- Kellékek
- 1. lépés: 1. Állítsa be az Atecc608a készüléket
- 2. lépés: 2. Az áramkör tervezése (Master és Slave)
- 3. lépés: 3. a kód (Slave és Master)
- 4. lépés: 4. Menjen tovább
- 5. lépés: Következtetés
Videó: Vezeték nélküli titkosított kommunikáció Arduino: 5 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:40
Ü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ű:
- Titkosított adatok felhasználása két vagy több IoT objektum között.
- Alacsony költségű kellékek
- 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:
- Állítsa be az ATECC608A chipet
- Végezze el az áramkört (főcsomópont és szolgacsomópont)
- Kódrész
- 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
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)
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)
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,
- felébred, olvassa el ezt a csomagot, ha a csomag "Wake UP",
- generálja az adatokat,
- titkosítja az adatokat,
- küldje el az adatokat a masternek, várjon egy ACK csomagot,
- 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:
- A mester állítsa be hallgatás üzemmódban, és várja meg a kommunikációt
- Ha a kommunikáció
- 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
- Bontsa ki a 16 byte cypher -t
- Az adatok visszafejtése
- Nyomtassa ki az adatokat soros formában
- 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:
Vezeték nélküli Arduino robot a HC12 vezeték nélküli modul használatával: 7 lépés
Vezeték nélküli Arduino robot a HC12 vezeték nélküli modul használatával: Hé srácok, üdv újra. Korábbi hozzászólásomban elmagyaráztam, hogy mi az a H -híd áramkör, az L293D motorvezérlő IC, a malackalapú L293D motorvezérlő IC a nagyáramú motorvezérlők vezetéséhez, és hogyan tervezheti meg és készítheti el saját L293D motorvezérlő tábláját
Távirányítású autó - Vezeték nélküli vezeték nélküli Xbox 360 vezérlővel: 5 lépés
Távirányítású autó - vezérelhető a vezeték nélküli Xbox 360 vezérlő használatával: Ezek az utasítások saját távirányítású autó létrehozásához, vezeték nélküli Xbox 360 vezérlővel vezérelhetők
Ötven méter hatótávolságú vezeték nélküli hozzáférési pont TP Link WN7200ND USB vezeték nélküli adapterrel Raspbian Stretch -en: 6 lépés
Ötven méter hatótávolságú vezeték nélküli hozzáférési pont TP Link WN7200ND USB vezeték nélküli adapterrel a Raspbian Stretch -en: A Raspberry Pi kiválóan alkalmas biztonságos vezeték nélküli hozzáférési pontok létrehozására, de nem rendelkezik jó hatótávolsággal, TP Link WN7200ND USB vezeték nélküli adaptert használtam annak kiterjesztéséhez. Szeretném megosztani, hogyan kell csinálniMiért akarok málna pi -t használni router helyett? T
DIY vezeték nélküli mikrofon vezeték nélküli gitárrendszerhez: 4 lépés
DIY Wireless Mic to Wireless Guitar System: Néztem néhány videót és néhány zenekart, és szinte közülük vezeték nélküli rendszert használ a gitáron. Megőrülök, mozogok, sétálok, és azt csinálok, amit akarnak, anélkül, hogy a zsinórt használnám, ezért arról álmodozom, hogy lesz egy .. De .. nekem ez most túl drága, ezért erre jutottam
Hackeljen be egy vezeték nélküli kaputelefont egy vezeték nélküli riasztókapcsolóba vagy be/ki kapcsolóba: 4 lépés
Hackeljen be egy vezeték nélküli kaputelefont egy vezeték nélküli riasztókapcsolóba vagy be/ki kapcsolóba: Nemrég építettem egy riasztórendszert, és telepítettem a házamba. Mágneses kapcsolókat használtam az ajtókon, és bekötöttem a padláson. Az ablakok egy másik történet, és a kemény huzalozás nem volt lehetőség. Szükségem volt egy vezeték nélküli megoldásra, és ez