Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
Hamıya salam, Bu ikinci məqalədə, simsiz ünsiyyətinizi qorumaq üçün Atecc608a çipini necə istifadə edəcəyinizi izah edəcəyəm. Bunun üçün Simsiz hissə və Arduino UNO üçün NRF24L01+ istifadə edəcəyəm.
ATECC608A mikro çipi MicroChip tərəfindən hazırlanmış və bir çox təhlükəsizlik vasitələrinə malikdir. Məsələn, bu çip ECC Keys, AES Keys (AES 128 üçün) və SHA2 Hash saxlaya bilər.
Məqalə: NRF24L01 + Arduino UNO + ATECC608A
İki IoT Obyekti arasında ünsiyyət əsnasında birdən çox hücum ola bilər: Yüngül adam, Məlumatın surəti və daha çox.. Deməli fikrim çox sadədir:
- İki və ya daha çox IoT obyekti arasında şifrələnmiş məlumatların istifadəsi.
- Aşağı qiymətli təchizatlar
- Bir Arduino UNO ilə işləyə bilər
Mənim vəziyyətimdə istifadə edirəm
- AES Açarımı saxlamaq və məlumatlarımı şifrələmək/deşifr etmək üçün Atecc608a.
- Arduino Uno mikro nəzarətçi olaraq
- Məlumatlarımı göndərmək üçün NRF24L01
Bu layihə üçün bu addımları yerinə yetirməlisiniz:
- ATECC608A çipini qurun
- Dövr edin (Master Node və Slave Node)
- Kod hissəsi
- İrəli gedin!
"ATECC608A çipini qurun" ilk addımları üçün hər addımı sırayla izah edən başqa bir məqalə yazdım. Bağlantı buradadır:
İndi başla!
Təchizat
Bu layihə üçün sizə lazımdır:
- 2 Arduino UNO və ya Arduino NANO və ya Arduino Mega
- Bir az tel
- 2 Atecc608a (hər birinin qiyməti 0.60 dollardan azdır)
- 2 NRF24L01+
- 2 kondansatör (10 μF)
- Çörək lövhələri
ATECC608A çipinin necə qurulduğunu izah edən məqaləmə keçid -> Atecc608a -nın necə qurulacağını.
Addım 1: 1. Atecc608a qurun
ATECC608A qurmaq üçün atılacaq hər addımı ətraflı izah etməyəcəyəm, çünki bunu etmək üçün hər addımı izah edən tam bir məqalə yazdım. Bunu qurmaq üçün bu maddənin "2. Çipin Konfiqurasiyası (Atecc608a)" adlı "Adım 4" ə əməl etməlisiniz.
Bağlantı belədir: ATECC608A necə qurulacaq
Ayrıca, eyni konfiqurasiyanı Atecc608a, master tərəfi və qul tərəfi üçün qoymalısınız, əks halda məlumatlarınızın şifrəsini aça bilməyəcəksiniz
Xəbərdarlıq:
Bu çipi qurmaq üçün yuxarıdakı məqalənin bütün addımlarını ardıcıllıqla yerinə yetirməlisiniz. Bir addım yoxdursa və ya çip kilidlənmirsə, bu layihəni edə bilməzsiniz
Qalan:
Bunun üçün izləniləcək addım:
- Bir konfiqurasiya şablonu yaradın
- Bu şablonu çipə yazın
- Konfiqurasiya Zonasını kilidləyin
- AES Açarınızı (128 Bit) bir yuvaya yazın
- Məlumat Zonasını kilidləyin
Addım 2: 2. Dövrə Dizaynı (Usta və Kölə)
Bu layihədə bir Master Node və bir Slave Node olacaq.
Master düyün, node köməyi ilə göndərilən məlumatları aydın şəkildə çap edəcək. Hər X dəfə qul nodundan məlumat istəyəcək.
Qul nodu "şəbəkəni" dinləyəcək və "İstək məlumatı" aldıqda onu yaradacaq, şifrələyəcək və master düyünə göndərəcək.
Hər iki tərəf üçün də dövrə hakim və kölə eynidır:
- Bir arduino Nano
- Bir ATECC608A
- Bir NRF24L01
Dövrəni bu addıma bağladım (yuxarıdakı şəklə bax).
Arduino UNO üçün ATECC608A üçün bu, 8 sancaqdır. Yuxarıdakı "üst görünüşü" əlavə etdim:
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Arduino üçün NRF24L01 üçün:
- 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) -> yalnız Əsas rejimdə istifadə edilməyən Qulluq düyünü üçün
NRF24L01 -in IRQ pinindən niyə istifadə olunur
IRQ pin çox faydalıdır, bu pin NRF24L01 tərəfindən bir paket alındıqda (LOW) deməyə imkan verir, buna görə də qul nodeunu oyatmaq üçün bu pinə bir Interrupt bağlaya bilərik.
Addım 3: 3. Kod (Qul və Usta)
Qul Node
Qul Node üçün güc qənaətindən istifadə edirəm, çünki hər zaman qulaq asmaq lazım deyil.
Necə işləyir: qul nodu qulaq asır və "Wake UP paketi" almasını gözləyir. Bu paket, Master node tərəfindən quldan məlumat istəmək üçün göndərilir.
Mənim vəziyyətimdə iki int bir sıra istifadə edirəm:
// Oyan paketi
const int wake_packet [2] = {20, 02};
Düyüm bir paket alırsa,
- oyanır, bu paketi oxuyun, əgər paket "Uyan"
- məlumatları yaradır,
- məlumatları şifrələmək,
- məlumatları ustaya göndərin, ACK paketini gözləyin,
- yatmaq
AES Şifrələmə üçün 9 nömrəli yuvada bir açar istifadə edirəm.
Bu, Slave node üçün kodumdur
#"Arduino.h" daxil edin #"avr/yuxu.h" daxil edin #"avr/wdt.h" daxil edin
#"SPI.h" daxil edin
#"nRF24L01.h" daxil edin "RF24.h" daxil edin
#"Wire.h" daxil edin
// ATECC608A kitabxanası
#"ATECCX08A_Arduino/cryptoauthlib.h" daxil edin #"AES BASIC/aes_basic.h" daxil edin
#müəyyən ID_NODE 255
#AES_KEY (uint8_t) 9 təyin edin
ATCAIfaceCfg cfg;
ATCA_STATUS vəziyyəti;
RF24 radiosu (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / qısa fasilə təyin edildikdə yerinə yetirilən funksiya (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; float hum = 16.4;
uint8_t məlumatları [16];
uint8_t şifrəli məlumatlar [16];
// Bütün dəyərlərimi təyin etmək üçün bir String yaradın
// Hər bir dəyər "|" ilə ayrılır və "$" məlumatların sonu deməkdir // XƏBƏRDARLIQ: 11 uzunluqdan az olmalıdır String tmp_str_data = String (ID_NODE) + "|" + String (temp, 1) + "|" + Sətir (zümzümə, 1) + "$"; // 11 Serial.println ölçüsü ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (data, sizeof (data));
// Məlumatları şifrələyin
ATCA_STATUS status = aes_basic_encrypt (& cfg, data, sizeof (data), cypherata, AES_KEY); if (status == ATCA_SUCCESS) {uzun rand = təsadüfi ((uzun) 10000, (uzun) 99999);
// ilk üç rəqəmə əsaslanan UUID yaradın = ID node
String uuid = String (ID_NODE) + String (rand); // Ölçüsü 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)); // Radio.stopListening dinləməyi dayandırın ();
bool rslt;
// Məlumat Göndər rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Dinləməyə başlayın radio.startListening (); if (rslt) {// Bitmə və yuxu rejimi Serial.println (F ("Bitti")); }}}}}
boş quraşdırma ()
{Serial.begin (9600);
// Kitabxana qurucusunu işə salın
cfg.iface_type = ATCA_I2C_IFACE; // Rabitə növü -> I2C rejimi cfg.devtype = ATECC608A; // Çip növü cfg.atcai2c.slave_address = 0XC0; // I2C ünvanı (standart dəyər) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oyanmanın gecikməsi (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 (master ünvanı);
radio.openReadingPipe (1, slaveaddresse); // 3 -cü pinə kəsik əlavə edin // 2 -ci pinin kəsilməsini istəyirsinizsə, 1 -i O ilə dəyişdirin // FALLING MODE = POW LOW attachInterrupt -da pin (1, wakeUpIRQ, FALLING); }
boşluq döngəsi ()
{ // Ehtiyac yoxdur }
Usta Node
Master node, hər 8 saniyədə bir oyanır və qul Node'dan məlumat tələb edir
Necə işləyir: Usta nodu qula "WakeUP" paketi göndərir və gözlədikdən sonra qulla məlumat daxil olur.
Mənim vəziyyətimdə iki int bir sıra istifadə edirəm:
// Oyan paketi
const int wake_packet [2] = {20, 02};
Usta bir WakeUp paketi göndərdikdən sonra qul node bir ACK paketi göndərirsə:
- Master Dinləmə rejimində quruldu və ünsiyyət gözləyin
- Əgər ünsiyyət
- 8 ilk baytı çıxarın, kimlik düyümüdürsə, 8 baytın üç ilk baytını talan edin.
- 16 bayt şifrəni çıxarın
- Məlumatların deşifrini açın
- Məlumatları Serial şəklində çap edin
- Yuxu rejimi
AES Şifrələmə üçün 9 nömrəli yuvada bir açar istifadə edirəm.
Bu, Master node üçün kodumdur
#"Arduino.h" daxil edin
#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; ATCA_STATUS vəziyyəti; RF24 radiosu (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP paketi const int wake_packet [2] = {20, 02}; // gözətçi müdaxiləsi ISR (WDT_vect) {wdt_disable (); // gözətçini deaktiv edin} boş yuxu rejimi () {// ADC ADCSRA -nı deaktiv edin = 0; // müxtəlif "sıfırlama" bayraqlarını sil MCUSR = 0; // dəyişikliklərə icazə verin, sıfırlamanı deaktiv edin WDTCSR = bit (WDCE) | bit (WDE); // fasilə rejimini və WDTCSR = bit (WDIE) aralığını təyin edin | bit (WDP3) | bit (WDP0); // WDIE qurun və 8 saniyə gecikdir wdt_reset (); // gözətçi set_sleep_mode (SLEEP_MODE_PWR_DOWN) sıfırlayın; noInterrupts (); // zamanlanmış ardıcıllıq sleep_enable (); // MCUCR = bit (BODS) proqramında qəhvəyi söndürmə funksiyasını söndürün | bit (BODSE); MCUCR = bit (BODS); kəsir (); // növbəti təlimatın yerinə yetirilməsini təmin edir sleep_cpu (); // bir tədbir olaraq yuxunu ləğv edin sleep_disable (); } void setup () {Serial.begin (9600); // Kitabxana qurucusunu işə salın cfg.iface_type = ATCA_I2C_IFACE; // Rabitə növü -> I2C rejimi cfg.devtype = ATECC608A; // Çip növü cfg.atcai2c.slave_address = 0XC0; // I2C ünvanı (standart dəyər) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Oyanmanın gecikməsi (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; // Məlumat Göndər rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Dinləməyə Başla radio.startListening (); while (radio.available ()) {uint8_t cavab [32]; radio.read (& cavab, ölçüsü (cavab)); uint8_t node_id [3]; uint8_t şifrəsi [16]; memcpy (node_id, cavab, 3); memcpy (şifrə, cavab + 3, 16); if ((int) node_id == ID_NODE) {uint8_t çıxış [16]; ATCA_STATUS status = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Şifrələnmiş məlumatlar:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) çıxış ); }}}}} başqa {Serial.println ("Uyandırma Paketi üçün qəbul edilmir"); } // Yuxu rejimi 8 saniyəlik yuxu rejimi (); }
Sualınız varsa, cavablandırmaq üçün buradayam
Addım 4: 4. İrəli gedin
Bu nümunə sadədir, buna görə də bu layihəni inkişaf etdirə bilərsiniz
Təkmilləşdirmələr:
- AES 128 əsasdır və daha təhlükəsiz olmaq üçün AES CBC olaraq başqa bir AES alqoritmindən istifadə edə bilərsiniz.
- Simsiz modulu dəyişdirin (NRF24L01 23 Bayt yüklə məhdudlaşır)
- …
Bir yaxşılaşma görürsünüzsə, bunu müzakirə sahəsinə izah edin
Addım 5: Nəticə
Ümid edirəm bu məqalə sizin üçün faydalı olacaq. Mətnimdə səhv etsəm, üzr istəyirəm, amma ingilis dili mənim ana dilim deyil və yazdığımdan daha yaxşı danışıram.
Hər şeyi oxuduğunuz üçün təşəkkürlər.
Zövq alın.