Daftar Isi:

Komunikasi Terenkripsi Nirkabel Arduino: 5 Langkah
Komunikasi Terenkripsi Nirkabel Arduino: 5 Langkah

Video: Komunikasi Terenkripsi Nirkabel Arduino: 5 Langkah

Video: Komunikasi Terenkripsi Nirkabel Arduino: 5 Langkah
Video: Trik Mudah Komunikasi Serial Arduino dengan Nodemcu ESP8266 2024, November
Anonim
Arduino Komunikasi Terenkripsi Nirkabel
Arduino Komunikasi Terenkripsi Nirkabel

Halo semuanya, Pada artikel kedua ini, saya akan menjelaskan cara menggunakan chip Atecc608a untuk mengamankan komunikasi nirkabel Anda. Untuk ini, saya akan menggunakan NRF24L01+ untuk bagian Wireless dan Arduino UNO.

Chip mikro ATECC608A telah dirancang oleh MicroChip dan memiliki beberapa alat keamanan. Misalnya, chip ini dapat menyimpan Kunci ECC, Kunci AES (untuk AES 128) dan SHA2 Hash.

Artikel: NRF24L01 + Arduino UNO + ATECC608A

Selama komunikasi antara dua Obyek IoT, beberapa serangan dapat terjadi: Man Of the mild, Salinan informasi dan banyak lagi.. Jadi ide saya sangat sederhana:

  1. Pemanfaatan data terenkripsi antara dua atau lebih objek IoT.
  2. Persediaan berbiaya rendah
  3. Dapat bekerja dengan Arduino UNO

Dalam kasus saya, saya menggunakan

  • Atecc608a untuk menyimpan Kunci AES saya dan untuk mengenkripsi/mendekripsi data saya.
  • Arduino Uno sebagai Mikrokontroler
  • NRF24L01 untuk mengirim data saya

Anda harus mengikuti langkah-langkah untuk proyek ini:

  1. Siapkan chip ATECC608A
  2. Lakukan rangkaian (Master Node dan Slave Node)
  3. Bagian kode
  4. Pergi lebih jauh !

Untuk langkah pertama "Mengatur chip ATECC608A", saya menulis artikel lain yang menjelaskan setiap langkah secara berurutan. Tautannya ada di sini:

Sekarang mulai!

Perlengkapan

Untuk proyek ini Anda perlu:

  • 2 Arduino UNO atau Arduino NANO atau Arduino Mega
  • Beberapa kawat
  • 2 Atecc608a (masing-masing harganya kurang dari $0,60)
  • 2 NRF24L01+
  • 2 kapasitor (10 F)
  • Papan tempat memotong roti

Tautan ke artikel saya yang menjelaskan cara mengatur chip ATECC608A -> Cara mengatur Atecc608a

Langkah 1: 1. Siapkan Atecc608a

1. Siapkan Atecc608a
1. Siapkan Atecc608a
1. Siapkan Atecc608a
1. Siapkan Atecc608a

Saya tidak akan merinci setiap langkah yang harus diikuti untuk menyiapkan ATECC608A karena saya menulis artikel lengkap yang menjelaskan setiap langkah untuk melakukannya. Untuk mengaturnya, Anda harus mengikuti "Langkah 4" dari artikel ini yang disebut " 2. Konfigurasi Chip (Atecc608a)"

Tautannya adalah: Cara mengatur ATECC608A

Juga, Anda harus meletakkan konfigurasi yang sama untuk Atecc608a, sisi master dan sisi slave, jika tidak, Anda tidak akan dapat mendekripsi data Anda

Peringatan:

Untuk mengatur chip ini, Anda harus mengikuti setiap langkah dari artikel di atas secara berurutan. Jika satu langkah hilang atau chip tidak terkunci, Anda tidak akan dapat melakukan proyek ini

Sisa:

Langkah yang harus diikuti untuk ini:

  • Buat template konfigurasi
  • Tulis templat ini ke chip
  • Kunci Zona Konfigurasi
  • Tulis Kunci AES Anda (128 Bit) di slot
  • Kunci Zona Data

Langkah 2: 2. Desain Sirkuit (Master dan Slave)

2. Desain Sirkuit (Master dan Slave)
2. Desain Sirkuit (Master dan Slave)
2. Desain Sirkuit (Master dan Slave)
2. Desain Sirkuit (Master dan Slave)

Dalam proyek ini, Anda akan memiliki Master Node dan Slave Node.

Node master akan mencetak data yang dikirim oleh node slave secara jelas. Ini akan meminta data dari node budak setiap kali X.

Node budak akan mendengarkan "jaringan" dan ketika menerima "Permintaan data", itu akan menghasilkannya, mengenkripsi dan mengirimkannya ke node master.

Untuk kedua sisi, master dan slave rangkaiannya sama:

  • satu arduino nano
  • Satu ATECC608A
  • Satu NRF24L01

Saya memasang sirkuit ke langkah ini (lihat gambar di atas).

Untuk ATECC608A ke Arduino UNO, ini adalah soic 8 pin. Saya menambahkan "tampilan atas" di atas:

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

Untuk NRF24L01 ke 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) -> hanya untuk node Slave, tidak digunakan dalam mode Master

Mengapa menggunakan pin IRQ dari NRF24L01

Pin IRQ sangat berguna, pin ini memungkinkan untuk mengatakan (LOW) ketika sebuah paket diterima oleh NRF24L01, sehingga kita dapat memasang Interrupt ke pin ini untuk membangunkan node slave.

Langkah 3: 3. Kode (Budak dan Tuan)

3. Kode (Budak dan Tuan)
3. Kode (Budak dan Tuan)

Node Budak

Saya menggunakan hemat daya untuk Node budak karena tidak perlu mendengarkan sepanjang waktu.

Cara kerjanya: node slave mendengarkan dan menunggu untuk menerima "Paket Wake UP". Paket ini dikirim oleh node Master untuk meminta data dari slave.

Dalam kasus saya, saya menggunakan array dua int:

// Paket bangun

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

Jika node saya menerima sebuah paket,

  1. itu bangun, baca paket ini, jika paket itu "Bangun",
  2. itu menghasilkan data,
  3. mengenkripsi data,
  4. kirim data ke master, tunggu paket ACK,
  5. tidur.

Untuk Enkripsi AES, saya menggunakan kunci di slot nomor 9.

Ini adalah kode saya untuk simpul Budak

#sertakan "Arduino.h"#sertakan "avr/sleep.h" #sertakan "avr/wdt.h"

#sertakan "SPI.h"

#sertakan "nRF24L01.h" #sertakan "RF24.h"

#sertakan "Wire.h"

// perpustakaan ATECC608A

#sertakan "ATECCX08A_Arduino/cryptoauthlib.h" #sertakan "AES BASIC/aes_basic.h"

#tentukan ID_NODE 255

#define AES_KEY (uint8_t)9

ATCAIfaceCfg cfg;

status ATCA_STATUS;

radio RF24 (9, 10);

const uint64_t masteraddresse = 0x11111111111;

const uint64_t slaveaddresse = 0x11111111100;

/**

* \brief Fungsi dijalankan saat interupsi diset (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; dengung mengambang = 16,4;

data uint8_t[16];

uint8_t cypherdata[16];

// Bangun String untuk mengatur semua Nilai saya

// Setiap nilai dipisahkan dengan tanda "|" dan "$" berarti akhir data // PERINGATAN: Harus kurang dari 11 panjang String tmp_str_data = String(ID_NODE) + "|" + String(suhu, 1) + "|" + String(hum, 1) + "$"; //ukuran 11 Serial.println("tmp_str_data: " + tmp_str_data);

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

// Enkripsi data

ATCA_STATUS status = aes_basic_encrypt(&cfg, data, sizeof(data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) { long rand = acak((panjang)10000, (panjang)99999);

// menghasilkan UUID berdasarkan tiga nomor pertama = simpul ID

String uuid = String(ID_NODE) + String(Rand); // Ukuran 8

uint8_t tmp_uuid[8];

uint8_t data_to_send[32];

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

memcpy(data_ke_kirim, tmp_uuid, ukuran(tmp_uuid));

memcpy(data_ke_kirim + sizeof(tmp_uuid), cypherdata, sizeof(cypherdata)); // Berhenti mendengarkan radio.stopListening();

bool rslt;

// Kirim Data rslt = radio.write(&data_to_send, sizeof(data_to_send)); // Mulai Mendengarkan radio.startListening(); if (rslt) { // Akhiri dan mode tidur Serial.println(F("Selesai")); } } } } }

batalkan pengaturan()

{ Serial.begin(9600);

// Init konstruktor untuk perpustakaan

cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> mode I2C cfg.devtype = ATECC608A; // Jenis chip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai default) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Keterlambatan bangun (1500 md) cfg.rx_retries = 20;

radio.mulai();

radio.setDataRate(RF24_250KBPS); radio.maskIRQ(1, 1, 0); radio.enableAckPayload(); radio.setRetries(5, 5);

radio.openWritingPipe(alamat master);

radio.openReadingPipe(1, alamat budak); // Pasang interupsi ke pin 3 // Ubah 1 dengan O jika Anda ingin interupsi ke pin 2 // FALLING MODE = Pin di LOW attachInterrupt(1, wakeUpIRQ, FALLING); }

lingkaran kosong()

{ // Tidak dibutuhkan }

Node Utama

Node master bangun setiap 8 detik untuk meminta data dari Node budak

Cara kerjanya: Node master mengirim paket "WakeUP" ke slave dan setelah menunggu jawaban dari slave dengan data.

Dalam kasus saya, saya menggunakan array dua int:

// Paket bangun

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

Jika node slave mengirimkan paket ACK setelah master mengirimkan paket WakeUp:

  1. Master diatur dalam mode Dengarkan dan tunggu komunikasi
  2. Jika komunikasi
  3. Ekstrak 8 byte pertama, jarah tiga byte pertama dari 8 byte, jika ini adalah simpul ID
  4. Ekstrak 16 byte cypher
  5. Mendekripsi data
  6. Cetak data dalam Serial
  7. Mode tidur

Untuk Enkripsi AES, saya menggunakan kunci di slot nomor 9.

Ini adalah kode saya untuk node Master

#sertakan "Arduino.h"

#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; status ATCA_STATUS; radio RF24 (9, 10); const uint64_t masteraddresse = 0x11111111111; const uint64_t slaveaddresse = 0x11111111100; // Bangun paket const int wake_packet[2] = {20, 02}; // pengawas interupsi ISR(WDT_vect) { wdt_disable(); // nonaktifkan pengawas } void sleepmode() { // nonaktifkan ADC ADCSRA = 0; // hapus berbagai flag "reset" MCUSR = 0; // izinkan perubahan, nonaktifkan reset WDTCSR = bit(WDCE) | bit(WDE); // setel mode interupsi dan interval WDTCSR = bit(WDIE) | bit(WDP3) | bit(WDP0); // setel WDIE, dan tunda 8 detik wdt_reset(); // reset set_sleep_mode pengawas(SLEEP_MODE_PWR_DOWN); tidak ada interupsi(); // urutan waktunya mengikuti sleep_enable(); // matikan aktifkan brown-out di perangkat lunak MCUCR = bit(BODS) | bit(BODSE); MCUCR = bit(BODS); interupsi(); // menjamin instruksi berikutnya dieksekusi sleep_cpu(); // batalkan tidur sebagai tindakan pencegahan sleep_disable(); } batalkan pengaturan() { Serial.begin(9600); // Inisi konstruktor untuk perpustakaan cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> mode I2C cfg.devtype = ATECC608A; // Jenis chip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai default) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Keterlambatan bangun (1500 md) cfg.rx_retries = 20; radio.mulai(); radio.setDataRate(RF24_250KBPS); radio.maskIRQ(1, 1, 0); radio.enableAckPayload(); radio.setRetries(5, 5); radio.openWritingPipe(alamat budak); radio.openReadingPipe(1, alamat master); } void loop() { bool rslt; // Kirim Data rslt = radio.write(&wake_packet, sizeof(wake_packet)); if (rslt) { // Mulai Mendengarkan radio.startListening(); while (radio.available()) { uint8_t jawab[32]; radio.read(&jawaban, ukuran(jawaban)); uint8_t node_id[3]; sandi uint8_t[16]; memcpy(node_id, jawaban, 3); memcpy(sandi, jawab + 3, 16); if ((int)node_id == ID_NODE) { uint8_t keluaran[16]; ATCA_STATUS status = aes_basic_decrypt(&cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) { Serial.println("Data Terdekripsi: "); for (size_t i = 0; i < 16; i++) { Serial.print((char)output); } } } } } else{ Serial.println("Ack tidak menerima Paket Wakup"); } // Mode tidur 8 detik mode tidur(); }

Jika Anda memiliki pertanyaan, saya di sini untuk menjawabnya

Langkah 4: 4. Pergi Lebih Jauh

Contoh ini sederhana sehingga Anda dapat meningkatkan proyek ini

Perbaikan:

  • AES 128 adalah dasar dan Anda dapat menggunakan algoritme AES lainnya sebagai AES CBC agar lebih aman.
  • Ubah modul nirkabel (NRF24L01 dibatasi oleh muatan 23 Bytes)

Jika Anda melihat peningkatan yang harus dilakukan, jelaskan di area diskusi

Langkah 5: Kesimpulan

Saya harap artikel ini akan bermanfaat bagi Anda. Maaf jika saya melakukan kesalahan dalam teks saya tetapi bahasa Inggris bukan bahasa utama saya dan saya berbicara lebih baik daripada saya menulis.

Terima kasih telah membaca semuanya.

Bersenang senang lah.

Direkomendasikan: