Сымсыз шифрланған байланыс Arduino: 5 қадам
Сымсыз шифрланған байланыс Arduino: 5 қадам
Anonim
Arduino сымсыз шифрланған байланыс
Arduino сымсыз шифрланған байланыс

Барлығына сәлем, Бұл екінші мақалада мен сізге сымсыз байланыс қауіпсіздігі үшін Atecc608a чипін қалай пайдалану керектігін түсіндіремін. Ол үшін мен NRF24L01+ сымсыз бөлігі мен Arduino UNO үшін қолданамын.

ATECC608A микро чипі MicroChip -пен жасалған және көптеген қауіпсіздік құралдарына ие. Мысалы, бұл чип ECC кілттерін, AES кілттерін (AES 128 үшін) және SHA2 Hash сақтай алады.

Мақала: NRF24L01 + Arduino UNO + ATECC608A

Екі IoT объектісі арасындағы байланыс кезінде бірнеше шабуылдар болуы мүмкін: қарапайым адам, ақпарат көшірмесі және тағы басқалар.. Сондықтан менің ойым өте қарапайым:

  1. Екі немесе одан да көп IoT объектілері арасында шифрланған деректерді қолдану.
  2. Бағасы төмен жабдықтар
  3. Arduino UNO -мен жұмыс жасай алады

Менің жағдайда, мен қолданамын

  • Atecc608a менің AES кілтімді сақтауға және деректерді шифрлауға/шифрды ашуға арналған.
  • Arduino Uno микроконтроллер ретінде
  • Менің деректерімді жіберу үшін NRF24L01

Бұл жоба үшін келесі қадамдарды орындау қажет:

  1. ATECC608A чипін орнатыңыз
  2. Тізбекті жасаңыз (негізгі түйін мен құлдық түйін)
  3. Код бөлігі
  4. Әрі қарай жүр!

«ATECC608A чипін орнату» алғашқы қадамдары үшін мен әр қадамды ретімен түсіндіретін басқа мақала жаздым. Сілтеме мына жерде:

Енді бастаңыз!

Жабдықтар

Бұл жоба үшін сізге қажет:

  • 2 Arduino UNO немесе Arduino NANO немесе Arduino Mega
  • Кейбір сымдар
  • 2 Atecc608a (әрқайсысының бағасы 0,60 доллардан төмен)
  • 2 NRF24L01+
  • 2 конденсатор (10 мкФ)
  • Нан тақталары

ATECC608A -> Atecc608a чипін қалай орнату керектігін түсіндіретін менің мақалама сілтеме.

1 -қадам: 1. Atecc608a орнатыңыз

1. Atecc608a орнатыңыз
1. Atecc608a орнатыңыз
1. Atecc608a орнатыңыз
1. Atecc608a орнатыңыз

Мен ATECC608A орнату үшін әр қадамды егжей -тегжейлі айтпаймын, себебі мен оның барлық қадамдарын түсіндіретін толық мақала жаздым. Оны орнату үшін осы мақаланың «2. Чиптің конфигурациясы (Atecc608a)» деп аталатын «4 -қадамын» орындау керек.

Сілтеме: ATECC608A қалай орнатылады

Сондай -ақ, Atecc608a, негізгі және қосалқы жақтар үшін бірдей конфигурацияны қою қажет, әйтпесе сіз деректердің шифрын шеше алмайсыз

Ескерту:

Бұл чипті орнату үшін жоғарыдағы мақаланың әр қадамын ретімен орындау қажет. Егер бір қадам жоқ болса немесе чип бекітілмесе, сіз бұл жобаны жасай алмайсыз

Қалған:

Бұл үшін келесі қадамдарды орындаңыз:

  • Конфигурация үлгісін жасаңыз
  • Бұл үлгіні чипке жазыңыз
  • Конфигурация аймағын құлыптаңыз
  • AES кілтін (128 бит) ұяшыққа жазыңыз
  • Деректер аймағын құлыптаңыз

2 -қадам: 2. Схеманың дизайны (шебер мен құл)

2. Схеманың дизайны (шебер мен құл)
2. Схеманың дизайны (шебер мен құл)
2. Схеманың дизайны (шебер мен құл)
2. Схеманың дизайны (шебер мен құл)

Бұл жобада сізде негізгі түйін мен құлдық түйін болады.

Негізгі түйін қосалқы түйін жіберетін деректерді анық басып шығарады. Ол X түйінінен деректерді әр X рет сұрайды.

Қосалқы түйін «желіні» тыңдайды және «Деректерді сұрауды» алған кезде оны жасайды, шифрлайды және оны негізгі түйінге жібереді.

Екі жақ үшін де тізбек басты және құл бірдей:

  • Бір нано нано
  • Бір ATECC608A
  • Бір NRF24L01

Мен схеманы осы қадамға қостым (жоғарыдағы суретті қараңыз).

ATECC608A Arduino UNO үшін бұл 8 істікші. Мен жоғарыдан «жоғарғы көріністі» қостым:

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

NRF24L01 Arduino үшін:

  • 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) -> тек қосалқы түйін үшін, негізгі режимде қолданылмайды

NRF24L01 IRQ түйреуішін не үшін қолдану керек

IRQ түйрегіші өте пайдалы, бұл түйін NRF24L01 пакетін алған кезде (LOW) деп айтуға мүмкіндік береді, осылайша біз түйінді ояту үшін осы түйреуішке үзіліс тіркей аламыз.

3 -қадам: 3. Кодекс (Құл мен Мастер)

3. Кодекс (Құл мен Мастер)
3. Кодекс (Құл мен Мастер)

Құлдық түйін

Мен құлдық түйін үшін үнемдеуді қолданамын, себебі ол үнемі тыңдауды қажет етпейді.

Бұл қалай жұмыс істейді: қосалқы түйін тыңдайды және «Wake UP пакетін» алуды күтеді. Бұл пакетті негізгі түйін жіберушіден деректерді сұрау үшін жібереді.

Менің жағдайда мен екі int массивін қолданамын:

// Ояту пакеті

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

Егер менің түйінім пакетті алса,

  1. ол оянады, бұл пакетті оқыңыз, егер пакет «Оян» болса,
  2. ол деректерді қалыптастырады,
  3. мәліметтерді шифрлау,
  4. деректерді шеберге жіберіңіз, ACK пакетін күтіңіз,
  5. ұйықтау

AES шифрлау үшін мен 9 ұяшықтағы кілтті қолданамын.

Бұл менің құлдық түйінге арналған кодым

#«Arduino.h» қосу #«avr/sleep.h» қосу « #avr/wdt.h» қосу

#«SPI.h» қосыңыз

#қосу «nRF24L01.h» #қосу «RF24.h»

#«Wire.h» қосыңыз

// ATECC608A кітапханасы

#«ATECCX08A_Arduino/cryptoauthlib.h» қосу #«AES BASIC/aes_basic.h» қосу

255

AES_KEY (uint8_t) анықтаңыз 9

ATCAIfaceCfg cfg;

ATCA_STATUS күйі;

RF24 радиосы (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / қысқаша үзіліс орнатылған кезде орындалатын функция (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& деректер, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17.6; float hum = 16,4;

uint8_t деректері [16];

uint8_t шифрлық деректер [16];

// Менің барлық мәнімді орнату үшін жол құрыңыз

// Әр мән «|» белгісімен бөлінеді және «$» - деректердің аяқталуын білдіреді // ЕСКЕРТУ: 11 ұзындығынан аз болуы керек String tmp_str_data = String (ID_NODE) + «|» + Жол (темп, 1) + «|» + Жол (хум, 1) + «$»; // өлшемі 11 Serial.println («tmp_str_data:» + tmp_str_data);

tmp_str_data.getBytes (деректер, өлшемі (деректер));

// Деректерді шифрлау

ATCA_STATUS күйі = aes_basic_encrypt (& cfg, деректер, өлшемдер (деректер), шифрлар, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);

// үш бірінші санға негізделген UUID жасаңыз = ID түйіні

String uuid = Жол (ID_NODE) + Жол (rand); // 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 тыңдауды тоқтату ();

bool rslt;

// Деректерді жіберу rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Радио тыңдауды бастау.startListening (); if (rslt) {// Аяқтау және ұйқы режимі Serial.println (F («Орындалды»)); }}}}}

жарамсыз орнату ()

{Serial.begin (9600);

// Кітапхана үшін конструкторды іске қосыңыз

cfg.iface_type = ATCA_I2C_IFACE; // Байланыс түрі -> I2C режимі cfg.devtype = ATECC608A; // Чип түрі cfg.atcai2c.slave_address = 0XC0; // I2C addresse (әдепкі мән) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Оянудың кешігуі (1500 мс) 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); // Үзілісті 3 түйреуішке тіркеңіз // Егер үзілісті 2 түйреуішке үзгіңіз келсе, O арқылы 1 -ді өзгертіңіз // FALLING MODE = Pin LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

бос цикл ()

{ // Қажеті жоқ }

Негізгі түйін

Негізгі түйін әр 8 секунд сайын оянады және түйіннен деректерді сұрайды

Бұл қалай жұмыс істейді: Негізгі түйін құлға «WakeUP» пакетін жібереді және күткеннен кейін жауап беруші деректермен жауап береді.

Менің жағдайда мен екі int массивін қолданамын:

// Ояту пакеті

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

Егер негізгі түйін WakeUp пакетін жібергеннен кейін, қосалқы түйін ACK пакетін жіберсе:

  1. Мастер тыңдау режимінде орнатылды және байланысты күтіңіз
  2. Егер байланыс
  3. Алғашқы 8 байтты шығарыңыз, 8 байттың үш бірінші байтын тонаңыз, егер бұл идентификатор түйіні болса
  4. 16 байт шифрды шығарыңыз
  5. Деректердің шифрын шешіңіз
  6. Деректерді сериялық түрде басып шығарыңыз
  7. Ұйқы режимі

AES шифрлау үшін мен 9 ұяшықтағы кілтті қолданамын.

Бұл менің негізгі түйінге арналған кодым

#«Arduino.h» қосыңыз

#include «avr/sleep.h» #include «avr/wdt.h» #include «SPI.h» #include «nRF24L01.h» #include «RF24.h» #include «Wire.h» // ATECC608A кітапханасы #include «ATECCX08A_Arduino/cryptoauthlib.h» #include «AES BASIC/aes_basic.h» #define ID_NODE 255 #deesine AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS күйі; RF24 радиосы (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP пакеті const int wake_packet [2] = {20, 02}; // қарауылдың үзілуі ISR (WDT_vect) {wdt_disable (); // watchdog өшіру} void sleepmode () {// ADC ADCSRA өшіру = 0; // әр түрлі «ысыру» жалаушаларын тазарту MCUSR = 0; // өзгерістерге рұқсат ету, WDTCSR = бит (WDCE) қалпына келтіруді өшіру | бит (WDE); // үзіліс режимі мен аралықты орнатыңыз WDTCSR = бит (WDIE) | бит (WDP3) | бит (WDP0); // орнату WDIE, және 8 секундқа кешіктіру wdt_reset (); // күзетші set_sleep_mode (SLEEP_MODE_PWR_DOWN) қалпына келтіру; noInterrupts (); // уақыттық реттілік sleep_enable () бойынша жүреді; // MCUCR = bit (BODS) бағдарламалық жасақтамасында қоңыр түсіруді өшіру | бит (BODSE); MCUCR = бит (BODS); үзулер (); // келесі нұсқаулықтың орындалуына кепілдік береді sleep_cpu (); // сақтық шарасы ретінде ұйқыны болдырмау sleep_disable (); } void setup () {Serial.begin (9600); // cfg.iface_type = ATCA_I2C_IFACE кітапханасының конструкторын іске қосыңыз; // Байланыс түрі -> I2C режимі cfg.devtype = ATECC608A; // Чип түрі cfg.atcai2c.slave_address = 0XC0; // I2C addresse (әдепкі мән) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Оянудың кешігуі (1500 мс) 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; // Деректерді жіберу rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Start Listening Radio.startListening (); while (radio.available ()) {uint8_t жауап [32]; radio.read (& answer, sizeof (answer)); uint8_t node_id [3]; uint8_t шифр [16]; memcpy (node_id, жауап, 3); memcpy (шифр, жауап + 3, 16); if ((int) node_id == ID_NODE) {uint8_t шығару [16]; ATCA_STATUS күйі = aes_basic_decrypt (& cfg, шифр, 16, шығару, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println («Шифрланған деректер:»); for (size_t i = 0; i <16; i ++) {Serial.print ((char) шығысы ); }}}}} else {Serial.println («Ояну пакеті қабылданбайды»); } // Ұйқы режимі 8 секунд ұйқы режимі (); }

Егер сізде сұрақтар болса, мен жауап беруге келдім

4 -қадам: 4. Әрі қарай жүріңіз

Бұл мысал қарапайым, сондықтан сіз бұл жобаны жақсарта аласыз

Жақсартулар:

  • AES 128 негізгі болып табылады және қауіпсіз болу үшін AES басқа алгоритмін AES CBC ретінде пайдалануға болады.
  • Сымсыз модульді өзгертіңіз (NRF24L01 23 байт жүктемемен шектелген)

Егер сіз жақсартуды байқасаңыз, оны талқылау аймағында түсіндіріңіз

5 -қадам: Қорытынды

Бұл мақала сіз үшін пайдалы болады деп сенемін. Кешіріңіз, егер мен мәтіннен қателескен болсам, бірақ ағылшын тілі менің негізгі тілім емес, мен жазғаннан гөрі жақсы сөйлеймін.

Барлығын оқығаныңыз үшін рахмет.

Ләззат ал.

Ұсынылған: