সুচিপত্র:

Arduino এর সাথে নিরাপত্তা: Atecc608a: 7 ধাপ
Arduino এর সাথে নিরাপত্তা: Atecc608a: 7 ধাপ

ভিডিও: Arduino এর সাথে নিরাপত্তা: Atecc608a: 7 ধাপ

ভিডিও: Arduino এর সাথে নিরাপত্তা: Atecc608a: 7 ধাপ
ভিডিও: Arduino Bangla Tutorial Part - 52: Multitasking with Multiple Sensor in Arduino 2024, জুলাই
Anonim
Arduino সঙ্গে নিরাপত্তা: Atecc608a
Arduino সঙ্গে নিরাপত্তা: Atecc608a
Arduino সঙ্গে নিরাপত্তা: Atecc608a
Arduino সঙ্গে নিরাপত্তা: Atecc608a

বিষয়

সবাইকে অভিবাদন !

এটি আমার প্রথম নির্দেশযোগ্য নিবন্ধ তাই আমি আশা করি এটি আপনার সকলের জন্য আকর্ষণীয় হবে।

এই প্রবন্ধে, আমি আপনাকে ব্যাখ্যা করব কিভাবে "ATECC608A" নামে একটি মাইক্রো চিপ ব্যবহার করা যায় যা একাধিক নিরাপত্তা সরঞ্জাম সরবরাহ করে।

এই চিপটি মাইক্রোকিপ দ্বারা ডিজাইন করা হয়েছে এবং এটি "CryptoAuthentication চিপ" এর শেষ সংস্করণ। এই সংস্করণের আগে "ATSHA204A" এবং "ATECC508A" ছিল।

কেন আমি শেষ সংস্করণটি ব্যবহার করার সিদ্ধান্ত নিলাম এবং আগের সংস্করণটি নয়?

এই সংস্করণটি সবচেয়ে উন্নত চিপ এবং পুরাতন সংস্করণে নেই এমন কার্যকারিতা পেয়েছে (উদাহরণস্বরূপ: AES মডিউল, IO সুরক্ষা মডিউল …)।

কেন এই প্রকল্প?

আমি সাইবারসিকিউরিটির ডোমেইনে কাজ করি এবং প্রত্যেকের মতো আমি প্রোগ্রামিং এবং ইলেকট্রনিক্স পছন্দ করতাম। আমার অধ্যয়নের সময়, আমি আইওটি সিকিউরিটির একজন বিশেষজ্ঞের সাথে একটি কনফারেন্স পাই, যিনি আমাদের দেখিয়েছেন যে ইন্ডাস্ট্রিয়াল তাদের আইওটি বস্তুর নিরাপত্তা ব্যবহার করে না। আমি আমাদের একটি প্যাডলক দেখিয়েছি যা ব্লুটুথের মাধ্যমে আপনার স্মার্টফোন দিয়ে খোলা যায়। প্যাডলকে, একটি বাক্য বলেছিল "এই প্যাডলকটি কী প্যাডলকের চেয়ে সবচেয়ে নিরাপদ!"। এই বাক্যটি তাকে হাসিয়ে তোলে এবং তিনি বাক্যটি পরিবর্তন করেছেন "এই প্যাডলকটি এখন পর্যন্ত নির্মিত সবচেয়ে খারাপ প্যাডলক!"।

তিনি তার নিজের পিসি এবং একটি ব্লুটুথ স্নিফার দিয়ে আমাদের দেখিয়েছেন যে স্মার্টফোন দ্বারা প্রেরিত প্রতিটি কমান্ড প্রতিবার একই রকম এবং এই কমান্ডটি অনুলিপি করা এবং আপনার স্মার্টফোনে এটি পাঠানো খুবই সহজ। তিনি আমাদের ব্যাখ্যা করেছিলেন যে "শিল্প" এর জন্য "নিরাপত্তা" মূল সমস্যা নয়। তিনি আমাদের চিপস (0.60 $ এর কম) দেখিয়েছেন যা এই বস্তুর নিরাপত্তা স্তর যোগ করতে পারে।

এই বিক্ষোভের পরে, আমি কিছু ওপেন সোর্স প্রকল্প খুঁজে বের করার চেষ্টা করেছি যা আইওটি অবজেক্টে সুরক্ষা স্তর যুক্ত করে কিন্তু আমি এটি কখনও পাইনি।

তাই আমি এমন একটি প্রকল্পে কাজ করার সিদ্ধান্ত নিয়েছি যা দুটি আইওটি বস্তুর মধ্যে যোগাযোগের জন্য নিরাপত্তা স্তর ব্যবহার করে।

আমার ধারণা কি?

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

  1. দুই বা ততোধিক IoT অবজেক্টের মধ্যে এনক্রিপ্ট করা ডেটার ব্যবহার।
  2. কম খরচে সরবরাহ
  3. একজন Arduino UNO এর সাথে কাজ করতে পারেন

এখন আমি আপনাকে ব্যাখ্যা করব কিভাবে আমি একটি Arduino এবং Atecc608a চিপ দিয়ে এই বিমূর্ত ছবিটি বাস্তবায়ন করেছি। এই নিবন্ধে, আমি আপনাকে ব্যাখ্যা করব কিভাবে ATECC608A দিয়ে Arduino UNO ব্যবহার করতে হয়।

আমি পরের বার দুটি বস্তুর যোগাযোগ সম্পর্কে একটি নিবন্ধ লিখব।

সরবরাহ

এই প্রকল্পের জন্য আপনার কিছু জিনিস প্রয়োজন:

  1. Arduino UNO বা MEGA (চিপ অবশ্যই Atmega 328 বা ATMEGA 2560 হতে হবে)
  2. Atecc608A চিপ (প্রতিটি খরচ 0.80 $ এর কম, আপনার সরবরাহকারী ওয়েবসাইটে পাওয়া সহজ)
  3. 8-পিন SOIC অ্যাডাপ্টার
  4. কিছু তার এবং প্রতিরোধক

এই চিপের আগের সংস্করণ (Atecc508a) এর ডেটশীট এখানে পাওয়া যায় -> Datasheet Atecc508a

ধাপ 1: ধাপে ধাপে

ধাপে ধাপে
ধাপে ধাপে

এই প্রবন্ধে, আমি আপনাকে দেখাব কিভাবে এই চিপের কনফিগারেশন সংশোধন করা যায় এবং কিভাবে AES CBC অ্যালগরিদম ব্যবহার করে ডেটা এনক্রিপ্ট করা যায়।

আমরা সেই পদক্ষেপগুলি অনুসরণ করব:

  1. সার্কিটের নকশা
  2. এই চিপের কনফিগারেশন
  3. AES CBC মডিউল ব্যবহার
  4. কেন আপনি এই চিপ ব্যবহার করতে হবে

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

আমার Github: আমার Github

ধাপ 2: Atecc608a সম্পর্কে সতর্কতা

Atecc608a সম্পর্কে সতর্কতা
Atecc608a সম্পর্কে সতর্কতা

Atecc608a চিপ একটি "সহজ" চিপ নয়।

প্রথমত, এই চিপের ডকুমেন্টেশন এনডিএ -র অধীনে তাই আপনি এটি ইন্টারনেটে সম্পূর্ণ পাবেন না। কিন্তু এর জন্য কোন সমস্যা নেই, পূর্ববর্তী সংস্করণের ডেটশীট ইন্টারনেট ডেটাশীট কমপ্লিট ATECC508A তে পাওয়া যায়।

দ্বিতীয়ত, যখন আপনি এই চিপটি ব্যবহার করবেন তখন আপনাকে এর কনফিগারেশন লক করতে হবে এবং যদি চিপটি লক করা থাকে তাহলে কনফিগারেশন পরিবর্তন করা অসম্ভব। সুতরাং আপনি কখন কনফিগ জোন এবং ডেটা জোন লক করবেন সে বিষয়ে সতর্ক থাকুন।

তৃতীয়ত, C তে লেখা লাইব্রেরীটি অনেক বড় এবং সম্পূর্ণ, তাই আপনাকে আগে যে ফাংশনগুলো ব্যবহার করবে তার ডকুমেন্টেশন পড়তে হবে।

চার, লাইব্রেরি এই চিপের জন্য লিখেছিল আরডুইনো ইউএনওর জন্য কাজ করে না, কিন্তু এতে যোগ করা হয়েছে যে আরডুইনো ইউএনও এর সাথে কাজ করার জন্য এটির কার্যকারিতা প্রয়োজন।

চিপ ATECC608A

আপনি I2C দ্বারা এই চিপের সাথে যোগাযোগ করতে পারেন। এই চিপের ঠিকানা কনফিগারেশনে পরিবর্তন করা যেতে পারে।

এই চিপটিতে 16 টি ভিন্ন স্লট রয়েছে যা বিভিন্ন ধরণের ডেটা ধারণ করতে পারে:

  1. ECC কী (ব্যক্তিগত বা সর্বজনীন)
  2. AES কী
  3. অন্যান্য তথ্য (যেমন শা হ্যাশ বা শুধু শব্দ)

আমাদের ক্ষেত্রে, আমরা একটি স্লটে AES কী সংরক্ষণ করব।

ধাপ 3: 1. সার্কিটের বর্ণনা

1. সার্কিট এর Desing
1. সার্কিট এর Desing
1. সার্কিট এর Desing
1. সার্কিট এর Desing

1. সার্কিট ডিজাইন

এই সার্কিটের স্কিমা খুবই সহজ!

আপনাকে 3.3V শক্তি ব্যবহার করতে হবে কারণ সুপারিশ 2.0V এবং 5.5V এর মধ্যে কিন্তু আমি 3.3V ব্যবহার করতে পছন্দ করি।

এই চিপের জন্য, সাধারণত আপনার চিপের কোনায় একটি বিন্দু থাকে, এই বিন্দুটি হল এই বোর্ডের পিন 1। আমি পিন নম্বর সহ Atecc608a এর শীর্ষ দৃশ্য যুক্ত করেছি কারণ এটি একটি 8-লিড SOIC তাই চিপটি খুব ছোট।

  1. ARDUINO 3.3V -> PIN 8 (Atecc608a)
  2. ARDUINO GND -> PIN 4 (Atecc608a)
  3. ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  4. ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

আপনাকে 3.3V শক্তি ব্যবহার করতে হবে কারণ সুপারিশ 2.0V এবং 5.5V এর মধ্যে কিন্তু আমি 3.3V ব্যবহার করতে পছন্দ করি।

আমি Atecc608a এর শীর্ষ দৃশ্য যুক্ত করেছি কারণ এটি একটি 8-লিড SOIC তাই চিপটি খুব ছোট। যদি আপনি পছন্দ করেন, তাই সরবরাহকারীরা চিপ সোল্ডার দিয়ে কিছু বোর্ড তৈরি করে, এটি আপনার জন্য সহজ হতে পারে।

সতর্কতা: আমার ক্ষেত্রে, আমাকে আরডুইনো এবং চিপের এসডিএ (এসডিএলের জন্য) এর মধ্যে একটি প্রতিরোধক যুক্ত করতে হবে। আমি প্রতিটি জন্য একটি 4.7Kohm প্রতিরোধক যোগ।

ধাপ 4: 2. চিপের কনফিগারেশন (Atecc608a)

এনক্রিপশন বা ডিক্রিপশন ফাংশন ব্যবহার করার আগে আপনাকে চিপ কনফিগার করতে হবে। এই ধাপে, আমি এই চিপের কনফিগারেশনের জন্য আপনাকে যা করতে হবে তার প্রতিটি পদক্ষেপের বিবরণ দেব।

সতর্কতা: এই ধাপটি খুবই আমদানি করা এবং যদি আপনি শেষ হওয়ার আগে জোনগুলি লক করে রাখেন তবে আপনি সেগুলি পরিবর্তন করতে পারবেন না।

আগে যেমন ব্যাখ্যা করা হয়েছে, এই চিপ দুটি জোন পেয়েছে:

  1. কনফিগার জোন
  2. ডেটা জোন

কনফিগারেশন জোন 128 বাইট আকার পেয়েছে কিন্তু প্রথম 16 বাইট পরিবর্তন করা যাবে না।

এই চিপটি কনফিগার করার জন্য, আপনাকে দুটি ধাপ অনুসরণ করতে হবে। প্রতিটি ধাপকে ক্রম অনুসারে অনুসরণ করা খুব গুরুত্বপূর্ণ বা আপনার কনফিগারেশন কাজ করবে না, এবং আপনার চিপ লক হয়ে যাবে এবং ব্যবহারযোগ্য হবে না। সেই পদক্ষেপগুলি হল:

  1. একটি কনফিগারেশন টেমপ্লেট তৈরি করুন
  2. এই টেমপ্লেটটি চিপে লিখুন
  3. কনফিগ জোন লক করুন
  4. একটি স্লটে আপনার AES কী (128 বিট) লিখুন
  5. ডাটা জোন লক করুন

তথ্য

নীচে আমি আমার কোড সহ কনফিগারেশনের প্রতিটি ধাপের বিবরণ দিয়েছি, তবে কোনও উদ্বেগ নেই, আমি আমার গিথুবের কনফিগারেশনের একটি সম্পূর্ণ উদাহরণ যুক্ত করেছি। আমি প্রতিটি ফাংশনে মন্তব্য রাখি এবং আপনার জন্য প্রতিটি ধাপে একটি *.ino ফাইল পাওয়া যায়।

  • আমার Github: আমার Github
  • উদাহরণ কনফিগারেশনের পথ: configuration_example.ino

প্রথম ধাপ: একটি কনফিগারেশন টেমপ্লেট তৈরি করুন

আগে ব্যাখ্যা করা হয়েছে, কনফিগারেশন জোন 128 বিটের আকার পায়, কিন্তু প্রথম 16 বিট পরিবর্তন করা যায় না। এই অঞ্চলটি একাধিক অংশে গঠিত, কিন্তু এই প্রকল্পের জন্য আপনাকে এই কনফিগারেশন জোনের মাত্র 3 টি অংশ জানতে হবে:

  1. বাইট 16 -> এটি চিপের I2C ঠিকানা
  2. বাইট 20 থেকে 51 -> আপনি এই চিপের 16 টি স্লটের জন্য এখানে স্লটের ধরন পরিবর্তন করতে পারেন
  3. বাইট 96 থেকে 127 -> আপনি এখানে প্রতিটি স্লটে ব্যবহৃত কী বা ডেটার ধরন সেট করতে পারেন।

(যদি আপনার এই সমস্ত অঞ্চলের আরও ব্যাখ্যা প্রয়োজন হয়, দয়া করে ডকুমেন্টেশন পড়ুন (পৃষ্ঠা 13, বিভাগ 2.2))

এখানে, আমি একটি চিপের কনফিগারেশনের 112 বাইটের প্রতিটি বাইট/অংশ বিশদ বিবরণ দিয়েছি। এটি একটি উদাহরণ, কেনা প্রতিটি চিপের আলাদা কনফিগারেশন থাকতে পারে:

0xC0, // I2C ঠিকানা

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config Slot 1 0x85, 0x20, // Slot Config Slot 2 0x8F, 0x20, // Slot Config Slot 3 0xC4, 0x8F, // Slot Config Slot 4 0x8F, 0x8F, // Slot Config Slot 5 0x8F, 0x8F, // Slot Config Slot 6 0x9F, 0x8F, // Slot Config Slot 7 0x0F, 0x0F, // Slot Config Slot 8 0x8F, 0x0F, // Slot Config Slot 9 0x8F, 0x0F, // Slot Config Slot 10 0x8F, 0x0F, // Slot Config Slot 11 0x8F, 0x0F, // Slot Config Slot 12 0x8F, 0x0F, // Slot Config Slot 13 0x00, 0x00, // Slot Config Slot 14 0x00, 0x00, // স্লট কনফিগার স্লট 15 0xAF, 0x8F, // স্লট কনফিগ স্লট 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, // কী কনফিগারেশন স্লট 1 0x33, 0x00, // কী কনফিগারেশন স্লট 2 0x33, 0x00, // কী কনফিগারেশন স্লট 3 0x1C, 0x00, // কী কনফিগার স্লট 4 0x1C, 0x00, // কী কনফিগার স্লট 5 0x 1C, 0x00, // কী কনফিগারেশন স্লট 6 0x1C, 0x00, // কী কনফিগারেশন স্লট 7 0x3C, 0x00, // কী কনফিগারেশন স্লট 8 0x1A, 0x00, // কী কনফিগারেশন স্লট 9 0x3A, 0x00, // কী কনফিগারেশন স্লট 10 0x1A, 0x00, // কী কনফিগারেশন স্লট 11 0x3A, 0x00, // কী কনফিগারেশন স্লট 12 0x3A, 0x00, // কী কনফিগারেশন স্লট 13 0x3C, 0x00, // কী কনফিগারেশন স্লট 14 0x3C, 0x00, // কী কনফিগারেশন স্লট 15 0x1C, 0x00 // কী কনফিগারেশন স্লট 16

এই কনফিগারেশনটি আরও বুঝতে আমি এই কোডে কিছু মন্তব্য করেছি।

আপনার ক্ষেত্রে শুধুমাত্র তিনটি জিনিস বুঝতে হবে:

  1. বাইট 16 -> এটি চিপের I2C ঠিকানা
  2. বাইট 20 থেকে 51 -> আপনি এই চিপের 16 টি স্লটের জন্য এখানে স্লটের ধরন পরিবর্তন করতে পারেন
  3. বাইট 96 থেকে 127 -> আপনি এখানে প্রতিটি স্লটে ব্যবহৃত কী বা ডেটার ধরন সেট করতে পারেন।

আমি কনফিগারেশনের ধরন ব্যাখ্যা করব না এবং কেন আমি এটি ব্যবহার করেছি এবং অন্যটি নয় কারণ সবকিছু ব্যাখ্যা করা জটিল। যদি আপনার আরও তথ্যের প্রয়োজন হয় তবে ডকুমেন্টেশনে যান, "SlotConfig" এর জন্য পৃষ্ঠা 16 বিভাগ 2.2.1 এবং "KeyConfig" এর জন্য পৃষ্ঠা 19 বিভাগ 2.2.5

এই উদাহরণের জন্য, আপনি একটি AES কী সংরক্ষণ করতে স্লট 9 ব্যবহার করবেন।

এর জন্য, আমাদের লাগাতে হবে (যদি আপনার প্রয়োজন হয়, আপনি উপরের উদাহরণটি অনুলিপি করতে পারেন, এতে পরিবর্তন করা হয়েছে):

  1. বাইট 36 = 0x8F
  2. বাইট 37 = 0x0F
  3. বাইট 112 = 0x1A
  4. বাইট 113 = 0x00

কেন আমি এই কনফিগারেশনটি সেট করেছি: এই চিপের প্রতিটি স্লটের জন্য, আপনি চিপকে বলার জন্য প্যারামিটার সেট করতে পারেন কোন ধরনের ডেটা সঞ্চয় করা হবে। আপনার একাধিক পরামিতি আছে:

  • স্লট লেখা বা পড়া হতে পারে (ক্রিয়া পরিষ্কার বা এনক্রিপ্ট)
  • সংরক্ষিত ডেটার প্রকার (ECC কী, পাবলিক কী, SHA হ্যাশ, AES কী …)
  • স্লট লক করা যায়
  • চাবি উৎপাদনের অনুমতি আছে

বাইট 36 এবং 37 দিয়ে "0x0F8F" এ সেট করুন:

  • ক্লিয়ারে ডেটা লেখা যায়
  • এই স্লটের বিষয়বস্তু গোপন এবং পড়া যাবে না
  • চেকম্যাক কপি কমান্ডের জন্য স্লট ব্যবহার করা যাবে না

বাইট 112 এবং 113 দিয়ে "0x001A" এ সেট করুন:

স্লট চারটি AES 128-বিট প্রতিসম কীগুলি সংরক্ষণ করতে পারে (কী টাইপ = 0x6)

দ্বিতীয় ধাপ: এই কনফিগারেশনটি লিখুন

এই পদক্ষেপটি খুবই গুরুত্বপূর্ণ কারণ আমরা আমাদের কনফিগারেশন দিয়ে চিপ সেট করব এবং যদি এই কনফিগারেশন ভালো না হয়, তাহলে আপনি এই চিপটি ব্যবহার করবেন।

কিন্তু কোন চিন্তা নেই, যতক্ষণ কনফিগারেশন লক করা না থাকে, আপনি আপনার কনফিগারেশন পরিবর্তন করতে পারেন।

এখানে, এই কোডটি চিপে কনফিগারেশন লিখতে ব্যবহৃত হয়:

/** / সংক্ষিপ্ত চিপে একটি নতুন কনফিগারেশন লিখুন।

* / param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন পাওয়া যাবে atca_cfgs.h * / param [in] config অ্যারে uint8_t কনফিগারেশন (দৈর্ঘ্য 112) * / param [in] n কনফিগারেশন অ্যারের আকার * success সাফল্যের উপর ATCA_SUCCESS ফেরত দিন, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) ATCA_BAD_PARAM ফিরিয়ে দিন; ATCA_STATUS অবস্থা; অবস্থা = atcab_init (cfg); যদি (অবস্থা == ATCA_SUCCESS) {// কনফিগারেশন অ্যারে চিপে লিখুন // 16 বাইটের প্যাডিং (16 প্রথম বাইট লেখা যাবে না) অবস্থা = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); ফিরে আসার অবস্থা; } ফিরে আসার অবস্থা; }

এই ফাংশনটি চিপে আপনার কনফিগারেশন লিখবে।

তৃতীয় ধাপ: কনফিগারেশন জোন লক করুন

সতর্কতা: এই ধাপে সাবধান থাকুন, যদি আপনি এই জোনটি লক করেন এবং আপনার কনফিগারেশন ভাল না হয়, চিপটি ব্যবহারযোগ্য নয় এবং আপনি এই অঞ্চলটি পরিবর্তন করতে পারবেন না।

এই কর্মের জন্য, আমরা এই ফাংশনটি ব্যবহার করব:

/** / সংক্ষিপ্ত চেক করুন একটি DATA_ZONE বা CONFIG_ZONE লক করা আছে কিনা

* / param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন পাওয়া যাবে atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA অথবা LOCK_ZONE_CONFIG * / রিটার্ন ATCA_SUCCESS সাফল্যে, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {ATCA_STATUS অবস্থা; বুল লক = মিথ্যা; যদি (জোন! = (uint8_t) LOCK_ZONE_CONFIG && জোন! অবস্থা = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS ফেরত দিন; } ATCA_BAD_PARAM ফেরত দিন; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

চতুর্থ ধাপ: একটি স্লটে আপনাকে AES কী লিখুন

এই অংশে আপনি চিপের কনফিগারেশনে সংজ্ঞায়িত স্লটে ব্যক্তিগত AES কী সেট করবেন।

এই উদাহরণের জন্য, আমি চিপের 9 নম্বর স্লট ব্যবহার করব।

আপনাকে জানতে হবে: এই চিপের একটি বিশেষ বৈশিষ্ট্য হল আপনি শুধুমাত্র 4 বাইট বা 32 বাইট দ্বারা স্লটে ডেটা লিখতে পারেন। AES এর জন্য আমাদের 128 বিট কী প্রয়োজন তাই 16 বাইট ডেটা। তাই আমি 32 বাইট ডেটা রাখার জন্য এই স্লটে 16 টি বাইটের কী লেখার সিদ্ধান্ত নিয়েছি।

এখন, আমি আপনাকে ব্যবহৃত কোডটি দেখাব:

/** / একটি নির্দিষ্ট স্লটে AES কী লিখুন। * / param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন পাওয়া যাবে atca_cfgs.h * / param [in] key key স্লট নম্বর * / param [in] datakey key array uint8_t * / param [in] n কী অ্যারের আকার * AT সাফল্যের উপর ATCA_SUCCESS, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (key 16) return ATCA_BAD_PARAM; যদি (len! = 32) ATCA_BAD_PARAM ফেরত দেয়; ATCA_STATUS অবস্থা = atcab_init (cfg); যদি (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) কী, 0, 0, datakey, 32); যদি (স্ট্যাটাস! = ATCA_SUCCESS) রিটার্ন স্ট্যাটাস; } ফিরে আসার অবস্থা; }

এই উদাহরণের জন্য, আমি 16 টি বাইটের দুটি AES কী ব্যবহার করব:

// AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

যদি এই ক্রিয়াটি ভাল হয়, এখন, আপনাকে শেষ ধাপটি পাস করতে হবে "ডেটা জোন লক করুন"

শেষ ধাপ: ডেটা জোন লক করুন

সতর্কতা: এই ধাপে সাবধান থাকুন, যদি আপনি এই জোনটি লক করেন এবং আপনার ডেটা সেট না থাকে, তাহলে চিপটি ব্যবহারযোগ্য নয় এবং আপনি এই অঞ্চলটি পরিবর্তন করতে পারবেন না।

এই কর্মের জন্য, আমরা এই ফাংশনটি ব্যবহার করব:

/** / সংক্ষিপ্ত চেক করুন একটি DATA_ZONE বা CONFIG_ZONE লক করা আছে কিনা

* / param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন পাওয়া যাবে atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA অথবা LOCK_ZONE_CONFIG * / রিটার্ন ATCA_SUCCESS সাফল্যে, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {ATCA_STATUS অবস্থা; বুল লক = মিথ্যা; যদি (জোন! = (uint8_t) LOCK_ZONE_CONFIG && জোন! অবস্থা = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS ফেরত দিন; } ATCA_BAD_PARAM ফেরত দিন; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

যদি এই ক্রিয়াটি ভাল হয়, আপনার চিপ ব্যবহারের জন্য প্রস্তুত

ধাপ 5: 3. AES CBC মডিউল ব্যবহার

3. AES CBC মডিউল ব্যবহার
3. AES CBC মডিউল ব্যবহার

অ্যালগরিদম AES CBC এবং Atecc608a চিপের মাধ্যমে কিভাবে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করবেন তা আমি ব্যাখ্যা করব।

মনে রাখবেন: এই ফাংশনটি ব্যবহার করার আগে, আপনাকে চিপ সেট আপ করতে হবে। এই জন্য, এই নিবন্ধের ধাপ 2 অনুসরণ করুন

এই চিপ একাধিক ধরনের AES মডিউল (AES 128 বিট) পেয়েছে, শুধুমাত্র AES 128 বিটই সম্ভব:

  1. AES স্বাভাবিক
  2. AES CBC
  3. AES GCM (GFM হ্যাশ সহ) (আরো ব্যাখ্যা করার জন্য উইকিপিডিয়া দেখুন)

এটি ব্যবহার করা সহজ করার জন্য, আমি দুটি ফাংশন তৈরি করেছি:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

এই দুটি ফাংশন আমার Github এ উপলব্ধ।

ব্যাখ্যা

আমি AES CBC অ্যালগরিদম ব্যবহার করা পছন্দ করি কারণ এটি বেসিক AES 128 বিটের চেয়ে নিরাপদ। এই অ্যালগরিদম আপনার ডেটা এনক্রিপ্ট করার জন্য একটি প্রাথমিক ভেক্টর ব্যবহার করে।

তথ্য

নীচে আমি এনক্রিপশন এবং ডিক্রিপশন পদ্ধতির প্রতিটি ধাপের বিবরণ দিলাম। কিন্তু আমি Arduino এর জন্য একটি কোড লিখেছিলাম যা এই দুটি ফাংশন ব্যবহার করে। আপনি আমার Github এ এই কোডটি দেখতে পারেন:

  • Github: আমার Github
  • কোড "এনক্রিপ্ট/ডিক্রিপ্ট" এর উদাহরণ: AES_crypto_example.ino

প্রথম ধাপ: আপনার ডেটা এনক্রিপ্ট করুন

এই অংশে, আমি আপনাকে দেখাব কিভাবে আপনার ডেটা এনক্রিপ্ট করবেন।

প্রথমে আপনার এই ফাংশনটির প্রয়োজন হবে:

/** A সংক্ষিপ্ত এনক্রিপ্ট ডেটা AES CBC অ্যালগরিদম ব্যবহার করে* m param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন atca_cfgs.h * / param [in] ডেটাতে পাওয়া যেতে পারে শব্দগুলি এনসাইপ্ট করার জন্য (অবশ্যই ১ 16 দ্বারা বিভক্ত হতে হবে, সর্বোচ্চ দৈর্ঘ্য 240), সর্বাধিক দৈর্ঘ্য 240) * / প্যারাম [আউট] iv AES CBC- এ ব্যবহৃত প্রাথমিক ভেক্টর (এই var- তে ভেক্টর ফিরিয়ে দিন) * m param [out] সাইফারটেক্সট এখানে সাইফার পাঠ্য * / param [ইন] কী স্লট নম্বর কী * AT সাফল্যে ATCA_SUCCESS ফেরত দিন, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *ciphertext, uint8_t key) {atca_aes_cbc_ctx_t ctx; যদি (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); ফিরুন ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS অবস্থা = atcab_init (cfg); যদি (অবস্থা == ATCA_SUCCESS) {অবস্থা = atcab_aes_cbc_init (& ctx, কী, 0, tmp_iv); যদি (অবস্থা! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, code error 0x")); Serial.println (স্ট্যাটাস, HEX); প্রত্যাবর্তন; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int সর্বোচ্চ = len / 16; জন্য (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & ciphertext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (স্ট্যাটাস, HEX); } ফিরে আসার অবস্থা; } ফিরে আসার অবস্থা; }

এই ফাংশনটি ব্যবহার করা সহজ, আপনাকে দুটি জিনিস সেট করতে হবে:

  1. 16 বাইটের একটি খালি IV (প্রাথমিক ভেক্টর)
  2. এনক্রিপ্ট করার জন্য ডেটা (সর্বোচ্চ আকার 240 বাইট)

এখানে একটি উদাহরণ "কিভাবে এই ফাংশন ব্যবহার করবেন"।

আমি "AAAAAAAAAAAAAAA" শব্দটি এনক্রিপ্ট করতে চাই, আমার কী "9" স্লটে লেখা আছে:

ATCA_STATUS অবস্থা = atcab_init (& cfg); যদি (অবস্থা! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () ব্যর্থ: কোড -> 0x")); Serial.println (স্ট্যাটাস, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // মূল পাঠ্য uint8_t iv [IV_LENGTH_CBC]; // প্রাথমিক ভেক্টর uint8_t সাইফারডাটা [sizeof (plaintext)]; // ডেটা এনক্রিপ্ট করা অবস্থা = aes_cbc_encrypt (& cfg, plaintext, sizeof (plaintext), iv, cypherdata, 9);

যদি ক্রিয়াটি ভাল হয়, তাহলে আপনি "সাইফারডাটা" ভেরিয়েবলে এনক্রিপ্ট করা ডেটা এবং ভেরিয়েবল "IV" এ ইনিশিয়াল ভেক্টর পাবেন।

আপনার টেক্সট ডিক্রিপ্ট করার জন্য সেই দুটি ভেরিয়েবল রাখুন!

দ্বিতীয় ধাপ: আপনার ডেটা ডিক্রিপ্ট করুন

আপনার ডেটা ডিক্রিপ্ট করতে আপনার দুটি জিনিসের প্রয়োজন হবে:

  1. প্রাথমিক ভেক্টর
  2. সাইফার ডেটা (এনক্রিপ্ট করা ডেটা)

আপনার ডেটা ডিক্রিপ্ট করতে, আপনার এই ফাংশনটির প্রয়োজন হবে:

/** A সংক্ষিপ্ত ডিক্রিপ্ট ডেটা AES CBC অ্যালগরিদম ব্যবহার করে* m param [in] cfg লজিক্যাল ইন্টারফেস কনফিগারেশন। কিছু পূর্বনির্ধারিত * কনফিগারেশন পাওয়া যাবে atca_cfgs.h * / param [in] ciphertext Words to decypt (অবশ্যই 16 দ্বারা বিভক্ত হতে হবে, সর্বাধিক দৈর্ঘ্য 240) * m param [in] len length of words to decypt (অবশ্যই 16 দ্বারা ভাগ করতে হবে), সর্বাধিক দৈর্ঘ্য 240) * / param [in] iv AES CBC * / param [out] প্লেইন টেক্সট এখানে ব্যবহার করুন ডিক্রিপ্ট করা পাঠ্য * / param [ইন] কী এর স্লট নম্বর * success সাফল্যের উপর ATCA_SUCCESS, অন্যথায় একটি ত্রুটি কোড। */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *ciphertext, int len, uint8_t *iv, uint8_t *plaintext, uint8_t key) {atca_aes_cbc_ctx_t ctx; যদি (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); ফিরুন ATCA_BAD_PARAM; } ATCA_STATUS অবস্থা = atcab_init (cfg); যদি (অবস্থা == ATCA_SUCCESS) {অবস্থা = atcab_aes_cbc_init (& ctx, কী, 0, iv); যদি (অবস্থা! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, কোড ত্রুটি 0x")); Serial.println (স্ট্যাটাস, HEX); প্রত্যাবর্তন; } int max = len / 16; জন্য (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & plaintext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (স্ট্যাটাস, HEX); } ফিরে আসার অবস্থা; } ফিরে আসার অবস্থা; }

আমি আমার আগের ডেটা ডিক্রিপ্ট করতে চাই (নিচে দেখুন, প্রথম ধাপ)। এর জন্য আমি এটি করব:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t সাইফারডাটা [sizeof (plaintext)]; uint8_t decryptdata [sizeof (plaintext)]; অবস্থা = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); যদি (অবস্থা == ATCA_SUCCESS) {Serial.print ("ডিক্রিপ্ট করা পাঠ্য হল:"); জন্য (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } অন্যথায় Serial.println (স্ট্যাটাস, HEX); প্রত্যাবর্তন; }

যদি ক্রিয়াটি ভাল হয়, তাহলে আপনার "ডিক্রিপ্টডাটা" ভেরিয়েবলে ডিক্রিপ্ট করা ডেটা থাকবে।

এখন আপনি চিপ Atecc608a দিয়ে এনক্রিপশন এবং ডিক্রিপশন ব্যবহার করতে জানেন

ধাপ 6: 5. কেন আপনি এই চিপ ব্যবহার করতে হবে

এনক্রিপ্ট করা ডেটা খুবই উপকারী কারণ আপনি আপনার তথ্য লুকিয়ে রাখতে পারেন এবং ওয়্যারলেস দ্বারা পাঠাতে পারেন অথবা শুধু সংরক্ষণ করতে পারেন।

এখানে ব্যবহারের কিছু উদাহরণ:

  1. একটি বহিরাগত EEPROM- এ সঞ্চিত ডেটা: আপনি একটি বহিরাগত EEPROM- এর ডেটা সুরক্ষিত করতে পারেন এবং যদি কেউ এখনও এই EEPROM থাকে, তাহলে তাকে ডিক্রিপশনের জন্য কী এবং IV এর প্রয়োজন হবে
  2. ওয়্যারলেস ডেটা পাঠান: আপনি এই এনক্রিপ্ট করা ডেটা ওয়্যারলেস (nrf24L01, RFM95W…) পাঠাতে পারেন এবং যদি কেউ আপনার ডেটা বাধা দেয় তবে এই ডেটা নিরাপদ হবে
  3. সংরক্ষিত পাসওয়ার্ড

আপনি এই চিপ দিয়ে একাধিক কাজ করতে পারেন। এটি একাধিক প্রকল্পে ব্যবহার করা যেতে পারে। আপনার যদি সময় থাকে, আমাকে বলুন আপনি কোন প্রকল্পে এই চিপটি ব্যবহার করবেন?

একটি শেষ উপদেশ, যদি আপনি কিছু ওয়্যারলেস প্রজেক্ট তৈরি করেন বা কিছু কাঁচা ডেটা সংরক্ষণ করেন, তাহলে সাবধান, নিরাপত্তা খুবই গুরুত্বপূর্ণ এবং যদি আপনি জানেন যে "নোব" এর জন্য আপনার ডেটা আটকানো বা চুরি করা কতটা সহজ। এখন ইন্টারনেটের মাধ্যমে, প্রত্যেকেরই তাদের কম্পিউটারে চালু করার স্ক্রিপ্ট থাকতে পারে শুধু আপনাকে "হ্যাক" করার জন্য!

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

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

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

উপভোগ কর.

প্রস্তাবিত: