সুচিপত্র:

ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino: 5 টি ধাপ
ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino: 5 টি ধাপ

ভিডিও: ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino: 5 টি ধাপ

ভিডিও: ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino: 5 টি ধাপ
ভিডিও: How to make Bluetooth control speaker at home, Bluetooth module #Bluetooth_music 2024, নভেম্বর
Anonim
ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino
ওয়্যারলেস এনক্রিপ্ট করা যোগাযোগ Arduino

সবাইকে অভিবাদন, এই দ্বিতীয় প্রবন্ধে, আমি আপনাকে ব্যাখ্যা করব কিভাবে আপনার বেতার যোগাযোগ নিরাপদ করার জন্য Atecc608a চিপ ব্যবহার করবেন। এই জন্য, আমি ওয়্যারলেস অংশ এবং Arduino UNO এর জন্য NRF24L01+ ব্যবহার করব।

মাইক্রো চিপ ATECC608A মাইক্রোশিপ দ্বারা ডিজাইন করা হয়েছে এবং একাধিক নিরাপত্তা সরঞ্জাম পেয়েছে। উদাহরণস্বরূপ, এই চিপটি ECC কী, AES কী (AES 128 এর জন্য) এবং SHA2 হ্যাশ সংরক্ষণ করতে পারে।

নিবন্ধ: NRF24L01 + Arduino UNO + ATECC608A

দুটি আইওটি অবজেক্টের মধ্যে যোগাযোগের সময়, একাধিক আক্রমণ হতে পারে: ম্যান অফ দ্য মাইল্ড, তথ্যের অনুলিপি এবং আরও অনেক কিছু.. তাই আমার ধারণাটি খুবই সহজ:

  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 μF)
  • ব্রেডবোর্ড

আমার প্রবন্ধের লিঙ্ক যা ব্যাখ্যা করে কিভাবে চিপ 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 বার স্লেভ নোড থেকে ডেটা অনুরোধ করবে।

স্লেভ নোড "নেটওয়ার্ক" শুনবে এবং যখন এটি একটি "রিকোয়েস্ট ডেটা" পাবে, তখন এটি জেনারেট করবে, এনক্রিপ্ট করবে এবং মাস্টার নোডে পাঠাবে।

উভয় পক্ষের জন্য, মাস্টার এবং দাস সার্কিট একই:

  • একটি আরডুইনো ন্যানো
  • একটি ATECC608A
  • একটি NRF24L01

আমি এই ধাপে সার্কিট সংযুক্ত করেছি (উপরের সিএফ ছবি)।

Arduino UNO- এর ATECC608A- এর জন্য, এটি একটি সিক 8 পিন। আমি উপরে "শীর্ষ দৃশ্য" যোগ করেছি:

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

Arduino- এ 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) -> শুধুমাত্র স্লেভ নোডের জন্য, মাস্টার মোডে ব্যবহৃত হয় না

কেন NRF24L01 এর IRQ পিন ব্যবহার করবেন?

IRQ পিন খুবই উপকারী, এই পিনটি NRF24L01 দ্বারা একটি প্যাকেট পাওয়ার সময় (LOW) বলার অনুমতি দেয়, তাই স্লেভ নোড জাগানোর জন্য আমরা এই পিনে একটি বাধা সংযুক্ত করতে পারি।

ধাপ 3: 3. কোড (স্লেভ এবং মাস্টার)

3. কোড (স্লেভ এবং মাস্টার)
3. কোড (স্লেভ এবং মাস্টার)

স্লেভ নোড

আমি স্লেভ নোডের জন্য পাওয়ার সেভ ব্যবহার করি কারণ এটি সব সময় শোনার প্রয়োজন হয় না।

এটি কীভাবে কাজ করে: স্লেভ নোড শুনুন এবং "ওয়েক ইউপি প্যাকেট" পাওয়ার জন্য অপেক্ষা করুন। এই প্যাকেটটি মাস্টার নোডের মাধ্যমে ক্রীতদাসের কাছ থেকে তথ্য চাওয়ার জন্য পাঠানো হয়।

আমার ক্ষেত্রে আমি দুটি 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"

#সংজ্ঞায়িত করুন ID_NODE 255

#AES_KEY (uint8_t) 9 নির্ধারণ করুন

ATCAIfaceCfg cfg;

ATCA_STATUS অবস্থা;

RF24 রেডিও (9, 10);

const uint64_t masteraddresse = 0x111111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / সংক্ষিপ্ত ফাংশন যখন বাধা সেট করা হয় (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& data, 32); যদি (data [0] == 20 && data [1] == 02) {float temp = 17.6; ভাসমান হাম = 16.4;

uint8_t ডেটা [16];

uint8_t সাইফারডাটা [16];

// আমার সব মান সেট করার জন্য একটি স্ট্রিং তৈরি করুন

// প্রতিটি মান একটি "|" দ্বারা পৃথক করা হয় এবং "$" মানে ডেটার সমাপ্তি // সতর্কতা: 11 দৈর্ঘ্যের কম হতে হবে String tmp_str_data = স্ট্রিং (ID_NODE) + "|" + স্ট্রিং (টেম্প, 1) + "|" + স্ট্রিং (হাম, 1) + "$"; // 11 সিরিয়াল.প্রিন্টলনের আকার ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (ডেটা, sizeof (ডেটা));

// ডেটা এনক্রিপ্ট করুন

ATCA_STATUS অবস্থা = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); যদি (অবস্থা == ATCA_SUCCESS) {দীর্ঘ র্যান্ড = এলোমেলো ((দীর্ঘ) 10000, (দীর্ঘ) 99999);

// তিনটি প্রথম সংখ্যা = আইডি নোডের উপর ভিত্তি করে একটি UUID তৈরি করুন

স্ট্রিং uuid = স্ট্রিং (ID_NODE) + স্ট্রিং (র্যান্ড); // 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)); // রেডিও শোনা বন্ধ করুন।

বুল rslt;

// পাঠান ডেটা rslt = radio.write (& data_to_send, sizeof (data_to_send)); // শুনতে শুরু করুন radio.startListening (); যদি (rslt) {// শেষ এবং ঘুমের মোড Serial.println (F ("Done")); }}}}}

অকার্যকর সেটআপ()

{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 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); // পিন 3 এ ইন্টারাপ্ট সংযুক্ত করুন // যদি আপনি পিন 2 এ বাধা চান তবে 1 দ্বারা সংশোধন করুন // FALLING MODE = LOW attachInterrupt এ পিন করুন (1, wakeUpIRQ, FALLING); }

অকার্যকর লুপ ()

{ // দরকার নেই }

মাস্টার নোড

মাস্টার নোড স্লেভ নোডের কাছ থেকে ডেটা জিজ্ঞাসা করতে প্রতি 8 সেকেন্ডে জেগে ওঠে

এটি কীভাবে কাজ করে: মাস্টার নোড ক্রীতদাসকে একটি "ওয়েকআপ" প্যাকেট পাঠায় এবং ডেটা সহ দাসের উত্তর অপেক্ষা করার পরে।

আমার ক্ষেত্রে আমি দুটি int এর অ্যারে ব্যবহার করি:

// ওকে ইউপি প্যাকেট

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

মাস্টার একটি WakeUp প্যাকেট পাঠানোর পরে যদি স্লেভ নোড একটি ACK প্যাকেট পাঠায়:

  1. শোনার মোডে মাস্টার সেট আপ করুন এবং একটি যোগাযোগের জন্য অপেক্ষা করুন
  2. যদি যোগাযোগ হয়
  3. 8 টি প্রথম বাইট বের করুন, 8 টি বাইটের তিনটি প্রথম বাইট লুট করুন, যদি এটি আইডি নোড হয়
  4. সাইফারের 16 বাইট বের করুন
  5. ডেটা ডিক্রিপ্ট করুন
  6. সিরিয়ালে ডেটা প্রিন্ট করুন
  7. সুপ্ত অবস্থা

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" #define ID_NODE 255 #deefine AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS অবস্থা; RF24 রেডিও (9, 10); const uint64_t masteraddresse = 0x111111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP প্যাকেট const int wake_packet [2] = {20, 02}; // ওয়াচডগ ISR (WDT_vect) {wdt_disable (); // অক্ষম ওয়াচডগ} অকার্যকর স্লিপমোড () {// অক্ষম ADC ADCSRA = 0; // বিভিন্ন "রিসেট" পতাকা সাফ করুন MCUSR = 0; // পরিবর্তনের অনুমতি দিন, রিসেট অক্ষম করুন WDTCSR = bit (WDCE) | বিট (WDE); // সেট ইন্টারাপ্ট মোড এবং একটি ব্যবধান WDTCSR = bit (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 (); } অকার্যকর সেটআপ () {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 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); } অকার্যকর লুপ () {বুল rslt; // ডেটা পাঠান rslt = radio.write (& wake_packet, sizeof (wake_packet)); যদি (rslt) {// শুনতে শুরু করুন 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); যদি ((int) node_id == ID_NODE) {uint8_t আউটপুট [16]; ATCA_STATUS অবস্থা = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); যদি (অবস্থা == ATCA_SUCCESS) {Serial.println ("ডিক্রিপ্টেড ডেটা:"); জন্য (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} অন্য } // স্লিপ মোড 8 সেকেন্ড স্লিপমোড (); }

যদি আপনার কোন প্রশ্ন থাকে, আমি এখানে এর উত্তর দিতে এসেছি

ধাপ 4: 4. আরও এগিয়ে যান

এই উদাহরণটি সহজ তাই আপনি এই প্রকল্পটি উন্নত করতে পারেন

উন্নতি:

  • AES 128 মৌলিক এবং আপনি AES এর অন্য অ্যালগরিদমকে AES CBC হিসাবে নিরাপদ করতে ব্যবহার করতে পারেন।
  • ওয়্যারলেস মডিউল পরিবর্তন করুন (NRF24L01 23 বাইটের প্লেলোড দ্বারা সীমাবদ্ধ)

আপনি যদি উন্নতি করতে দেখেন, তাহলে আলোচনা এলাকায় এটি ব্যাখ্যা করুন

ধাপ 5: উপসংহার

আমি আশা করি এই নিবন্ধটি আপনার জন্য দরকারী হবে। দু textখিত যদি আমি আমার লেখায় ভুল করে থাকি কিন্তু ইংরেজি আমার প্রধান ভাষা নয় এবং আমি আমার লেখার চেয়ে ভাল কথা বলি।

সবকিছু পড়ার জন্য ধন্যবাদ।

উপভোগ কর.

প্রস্তাবিত: