فهرست مطالب:

ارتباطات رمزگذاری شده بی سیم آردوینو: 5 مرحله
ارتباطات رمزگذاری شده بی سیم آردوینو: 5 مرحله

تصویری: ارتباطات رمزگذاری شده بی سیم آردوینو: 5 مرحله

تصویری: ارتباطات رمزگذاری شده بی سیم آردوینو: 5 مرحله
تصویری: 15دیمەنی سەرسوڕهێنەرتاکو بە چاوی خۆت نەیانبینی بڕوایان پێ ناکەیت😱 2024, نوامبر
Anonim
ارتباطات رمزگذاری شده بی سیم آردوینو
ارتباطات رمزگذاری شده بی سیم آردوینو

سلام به همگی ،

در این مقاله دوم ، نحوه استفاده از تراشه Atecc608a برای ایمن سازی ارتباطات بی سیم را برای شما توضیح خواهم داد. برای این منظور ، من از NRF24L01+ برای قسمت Wireless و Arduino UNO استفاده می کنم.

میکرو تراشه ATECC608A توسط MicroChip طراحی شده است و دارای چندین ابزار امنیتی است. به عنوان مثال ، این تراشه می تواند کلیدهای ECC ، کلیدهای AES (برای AES 128) و SHA2 Hash را ذخیره کند.

مقاله: NRF24L01 + آردوینو UNO + ATECC608A

در طول ارتباط بین دو شی IoT ، حملات متعددی می تواند وجود داشته باشد: Man Of the mild ، کپی اطلاعات و موارد دیگر. بنابراین ایده من بسیار ساده است:

  1. استفاده از داده های رمزگذاری شده بین دو یا چند شی IoT.
  2. لوازم کم هزینه
  3. می تواند با Arduino UNO کار کند

در مورد من ، من استفاده می کنم

  • Atecc608a برای ذخیره کلید AES من و رمزگذاری/رمزگشایی داده های من.
  • Arduino Uno به عنوان میکروکنترلر
  • NRF24L01 برای ارسال اطلاعات من

برای این پروژه باید مراحل زیر را دنبال کنید:

  1. تراشه ATECC608A را تنظیم کنید
  2. مدار را انجام دهید (Master Node و Slave Node)
  3. قسمت کد
  4. جلوتر برو!

برای اولین مراحل "راه اندازی تراشه ATECC608A" ، مقاله دیگری نوشتم که هر مرحله را به ترتیب توضیح می دهد. پیوند اینجاست:

حالا شروع کن!

تدارکات

برای این پروژه شما نیاز دارید:

  • 2 Arduino UNO یا Arduino NANO یا Arduino Mega
  • مقداری سیم
  • 2 Atecc608a (هریک هزینه کمتر از 0.60 دلار)
  • 2 NRF24L01+
  • 2 خازن (10 μF)
  • تخته نان

پیوند به مقاله من که نحوه تنظیم تراشه ATECC608A -> نحوه راه اندازی Atecc608a را توضیح می دهد

مرحله 1: 1. Atecc608a را راه اندازی کنید

1. Atecc608a را راه اندازی کنید
1. Atecc608a را راه اندازی کنید
1. Atecc608a را راه اندازی کنید
1. Atecc608a را راه اندازی کنید

من برای راه اندازی ATECC608A هر مرحله ای را که باید دنبال کنم توضیح نمی دهم ، زیرا یک مقاله کامل نوشتم که همه مراحل انجام آن را توضیح می دهد. برای راه اندازی آن ، باید "مرحله 4" این مقاله را با نام "2. پیکربندی تراشه (Atecc608a)" دنبال کنید.

پیوند این است: نحوه راه اندازی ATECC608A

همچنین ، باید همان تنظیمات را برای Atecc608a ، master side و slave side قرار دهید ، در غیر این صورت نمی توانید داده های خود را رمزگشایی کنید

هشدار:

برای راه اندازی این تراشه ، باید تمام مراحل مقاله بالا را به ترتیب دنبال کنید. اگر یک مرحله از دست رفته باشد یا تراشه قفل نشده باشد ، نمی توانید این پروژه را انجام دهید

باقی مانده:

برای این کار مراحل زیر را دنبال کنید:

  • ایجاد یک قالب پیکربندی
  • این الگو را روی تراشه بنویسید
  • قفل کردن منطقه پیکربندی
  • کلید AES (128 بیت) خود را در یک شکاف بنویسید
  • قفل کردن منطقه داده

مرحله 2: 2. طراحی مدار (Master and Slave)

2. طراحی مدار (Master and Slave)
2. طراحی مدار (Master and Slave)
2. طراحی مدار (Master and Slave)
2. طراحی مدار (Master and Slave)

در این پروژه شما یک Master Node و یک Slave Node خواهید داشت.

گره اصلی داده های ارسال شده توسط گره برده را به صورت واضح چاپ می کند. هر بار X داده را از گره برده درخواست می کند.

گره برده به "شبکه" گوش می دهد و هنگامی که "درخواست داده" را دریافت می کند ، آن را تولید می کند ، رمزگذاری می کند و به گره اصلی ارسال می کند.

برای هر دو طرف ، master و slave مدار یکسان هستند:

  • یک آردوینو نانو
  • یک عدد ATECC608A
  • یک عدد NRF24L01

مدار را به این مرحله وصل کردم (به عنوان تصویر بالا).

برای ATECC608A به Arduino UNO ، این 8 پین soic است. "نمای بالا" را در بالا اضافه کردم:

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

برای NRF24L01 به آردوینو:

  • 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) -> فقط برای گره Slave ، در حالت اصلی استفاده نمی شود

چرا از پین IRQ NRF24L01 استفاده کنید

پین IRQ بسیار مفید است ، این پین اجازه می دهد تا زمانی که یک بسته توسط NRF24L01 دریافت می شود (LOW) بگوید ، بنابراین می توانیم Interrupt را به این پین وصل کنیم تا گره برده بیدار شود.

مرحله 3: 3. کد (Slave و Master)

3. کد (برده و استاد)
3. کد (برده و استاد)

گره برده

من از power save برای برده Node استفاده می کنم زیرا نیازی به گوش دادن دائمی ندارد.

چگونه کار می کند: گره برده گوش می دهد و منتظر دریافت "بسته بیدار شدن از خواب" است. این بسته توسط گره Master ارسال می شود تا داده ها را از slave بخواهد.

در مورد من از یک آرایه از دو int استفاده می کنم:

// بسته Wake UP

const int wake_packet [2] = {20 ، 02} ؛

اگر گره من یک بسته دریافت کند ،

  1. بیدار شوید ، این بسته را بخوانید ، اگر بسته "Wake UP" است ،
  2. داده ها را تولید می کند ،
  3. رمزگذاری داده ها ،
  4. ارسال داده ها به استاد ، صبر کردن یک بسته ACK ،
  5. خواب.

برای رمزگذاری AES ، من از کلید در شکاف شماره 9 استفاده می کنم.

این کد من برای گره Slave است

#شامل "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"

#ID_ODE 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 (& data، 32)؛ if (data [0] == 20 && data [1] == 02) {float temp = 17.6؛ شناور همهم = 16.4 ؛

uint8_t data [16]؛

uint8_t cypherdata [16]؛

// برای تنظیم تمام مقدار من یک String بسازید

// هر مقدار با یک "|" جدا می شود. و "$" به معنی پایان داده است // هشدار: باید کمتر از 11 طول داشته باشد رشته tmp_str_data = رشته (ID_NODE) + "|" + رشته (دما ، 1) + "|" + رشته (همهم ، 1) + "$" ؛ // اندازه 11 Serial.println ("tmp_str_data:" + tmp_str_data) ؛

tmp_str_data.getBytes (داده ، اندازه (داده)) ؛

// رمزگذاری داده ها

وضعیت ATCA_STATUS = aes_basic_encrypt (& cfg، data، sizeof (data)، cypherdata، AES_KEY)؛ if (status == ATCA_SUCCESS) {long rand = random ((long) 10000، (long) 99999)؛

// یک UUID بر اساس سه عدد اول = گره ID ایجاد کنید

رشته uuid = رشته (ID_NODE) + رشته (رند) ؛ // اندازه 8

uint8_t tmp_uuid [8]؛

uint8_t data_to_ndest [32]؛

uuid.getBytes (tmp_uuid، sizeof (tmp_uuid) + 1)؛

memcpy (data_to_ndnd، 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))؛ // شروع به گوش دادن radio.startListening ()؛ if (rslt) {// حالت پایان و خواب Serial.println (F ("Done"))؛ }}}}}

void setup ()

{Serial.begin (9600) ؛

// سازنده کتابخانه را وارد کنید

cfg.iface_type = ATCA_I2C_IFACE؛ // نوع ارتباط -> حالت I2C cfg.devtype = ATECC608A؛ // نوع تراشه cfg.atcai2c.slave_address = 0XC0؛ // آدرس I2C (مقدار پیش فرض) 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 وصل کنید 1 را با O تغییر دهید // FALLING MODE = پین در LOW attachInterrupt (1 ، wakeUpIRQ ، FALLING) ؛ }

حلقه خالی ()

{ // نیازی نیست }

گره استاد

گره اصلی هر 8 ثانیه بیدار می شود تا از گره برده اطلاعات بخواهد

نحوه کار: گره اصلی یک بسته "WakeUP" را به برده ارسال می کند و پس از آن منتظر پاسخ برده با داده ها می ماند.

در مورد من ، من از آرایه ای از دو int استفاده می کنم:

// بسته Wake UP

const int wake_packet [2] = {20 ، 02} ؛

اگر گره برده پس از ارسال بسته WakeUp توسط یک بسته ACK ارسال کند:

  1. استاد در حالت گوش دادن تنظیم شده و منتظر ارتباط باشید
  2. اگر ارتباط
  3. اگر این گره شناسه است ، 8 بایت اول را استخراج کنید ، سه بایت اول از 8 بایت را غارت کنید
  4. 16 بایت سایفر را استخراج کنید
  5. رمزگشایی داده ها
  6. چاپ داده ها به صورت سریال
  7. حالت خواب

برای رمزگذاری AES ، من از کلید در شکاف شماره 9 استفاده می کنم.

این کد من برای گره Master است

#شامل "Arduino.h"

#شامل "avr/sleep.h" #شامل "avr/wdt.h" #شامل "SPI.h" #include "nRF24L01.h" #شامل "RF24.h" #شامل "Wire.h" // کتابخانه ATECC608A #شامل "ATECCX08A_Arduino/cryptoauthlib.h" #شامل "AES BASIC/aes_basic.h" #ID_ODE 255 #تعریف AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg ؛ وضعیت ATCA_STATUS ؛ رادیو RF24 (9 ، 10) ؛ const uint64_t masteraddresse = 0x1111111111؛ const uint64_t slaveaddresse = 0x1111111100؛ // Wake UP packet const int wake_packet [2] = {20، 02}؛ // دیده بان ISR (WDT_vect) را قطع می کند {wdt_disable ()؛ // غیرفعال کردن watchdog} void sleepmode () {// غیرفعال کردن ADC ADCSRA = 0؛ // پرچم های مختلف "بازنشانی" را پاک کنید MCUSR = 0؛ // اجازه تغییرات ، غیرفعال کردن بازنشانی WDTCSR = bit (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 (مقدار پیش فرض) 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) {// شروع به گوش دادن radio.startListening ()؛ در حالی که (radio.available ()) {uint8_t پاسخ [32]؛ radio.read (& answer، sizeof (answer))؛ uint8_t node_id [3]؛ uint8_t cypher [16]؛ memcpy (node_id، answer، 3)؛ memcpy (cypher ، پاسخ + 3 ، 16) ؛ if ((int) node_id == ID_NODE) {uint8_t خروجی [16] ؛ وضعیت ATCA_STATUS = aes_basic_decrypt (& cfg، cypher، 16، output، AES_KEY)؛ if (status == ATCA_SUCCESS) {Serial.println ("رمزگشایی داده ها:") ؛ برای (size_t i = 0 ؛ i <16؛ i ++) {Serial.print ((char) خروجی ) ؛ }}}}} else {Serial.println ("Ack not دریافت برای Wakup Packet")؛ } // حالت خواب 8 ثانیه sleepmode ()؛ }

اگر س haveالی دارید ، من اینجا هستم تا به آن پاسخ دهم

مرحله 4: 4. بیشتر بروید

این مثال ساده است بنابراین می توانید این پروژه را بهبود بخشید

بهبودها:

  • AES 128 اساسی است و می توانید از یک الگوریتم دیگر AES به عنوان AES CBC برای ایمن تر استفاده کنید.
  • ماژول بی سیم را تغییر دهید (NRF24L01 با ظرفیت بار 23 بایت محدود می شود)

اگر بهبودی را برای انجام می بینید ، آن را در زمینه بحث توضیح دهید

مرحله 5: نتیجه گیری

امیدوارم این مقاله برای شما مفید واقع شود. ببخشید اگر در متنم اشتباه کردم اما انگلیسی زبان اصلی من نیست و من بهتر از نوشتن صحبت می کنم.

ممنون که همه چیز را می خوانید.

از آن لذت ببرید.

توصیه شده: