فهرست مطالب:

امنیت با آردوینو: Atecc608a: 7 مرحله
امنیت با آردوینو: Atecc608a: 7 مرحله

تصویری: امنیت با آردوینو: Atecc608a: 7 مرحله

تصویری: امنیت با آردوینو: Atecc608a: 7 مرحله
تصویری: آموزش ساخت درب باز کن کارتی با آردوینو🔐|| DIY RFID Door Lock 2024, جولای
Anonim
امنیت با آردوینو: Atecc608a
امنیت با آردوینو: Atecc608a
امنیت با آردوینو: Atecc608a
امنیت با آردوینو: Atecc608a

موضوع

سلام به همگی!

این اولین مقاله آموزشی من است ، بنابراین امیدوارم برای همه شما جالب باشد.

در این مقاله ، نحوه استفاده از تراشه میکرو به نام "ATECC608A" که چندین ابزار امنیتی را ارائه می دهد ، برای شما توضیح خواهم داد.

این تراشه توسط MicroChip طراحی شده است و آخرین نسخه "تراشه CryptoAuthentication" است. قبل از این نسخه ، "ATSHA204A" و "ATECC508A" وجود داشت.

چرا تصمیم گرفتم از آخرین نسخه استفاده کنم و از نسخه قبلی استفاده نکنم؟

این نسخه پیشرفته ترین تراشه است و قابلیت هایی دارد که نسخه قدیمی آن را ندارد (برای مثال: ماژول AES ، ماژول حفاظتی IO …).

چرا این پروژه؟

من در حوزه امنیت سایبری کار می کنم و به عنوان همه دوست دارم برنامه نویسی و الکترونیک را دوست داشته باشم. در طول تحصیل ، با متخصصی در زمینه امنیت اینترنت اشیاء کنفرانسی دریافت می کنم که به ما نشان داد Industrial در امنیت IoT خود از امنیت استفاده نمی کند. من قفل قفلی را به شما نشان دادم که می تواند با تلفن هوشمند شما توسط بلوتوث باز شود. روی قفل ، جمله ای گفته شد "این قفل از قفل کلیدی امن تر است!". این جمله باعث لبخند او می شود و او جمله "این قفل بدترین قفل است که تا به حال ساخته شده است!" را اصلاح کرد.

او با رایانه شخصی خود و یک دستگاه تشخیص بلوتوث به ما نشان داد که هر فرمان ارسال شده توسط تلفن هوشمند هر بار یکسان است و کپی کردن این دستور و ارسال آن با تلفن هوشمند بسیار ساده است. او به ما توضیح داد که "امنیت" برای "صنعتی" مشکل اصلی نیست. او تراشه هایی (کمتر از 0.60 دلار) به ما نشان داد که می تواند لایه ای از امنیت را به این اشیاء اضافه کند.

پس از این تظاهرات ، من سعی کردم پروژه ای منبع باز پیدا کنم که لایه امنیتی را به شی IoT اضافه کند اما هرگز آن را پیدا نکردم.

بنابراین تصمیم گرفتم روی پروژه ای کار کنم که از لایه امنیتی برای ارتباط بین دو شیء اینترنت اشیا استفاده می کند.

ایده من چیست؟

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

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

اکنون من به شما توضیح خواهم داد که چگونه این تصویر انتزاعی را با تراشه آردوینو و Atecc608a پیاده سازی کردم. در این مقاله نحوه استفاده از Arduino UNO با ATECC608A را برای شما توضیح خواهم داد.

دفعه بعد مقاله ای در مورد ارتباط دو شیء خواهم نوشت.

تدارکات

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

  1. Arduino UNO یا MEGA (تراشه باید Atmega 328 یا ATMEGA 2560 باشد)
  2. تراشه Atecc608A (هریک کمتر از 0.80 دلار هزینه دارد ، در وب سایت تامین کننده شما به راحتی پیدا می شود)
  3. آداپتور SOIC 8 پین
  4. تعدادی سیم و مقاومت

برگه داده نسخه قبلی این تراشه (Atecc508a) در اینجا موجود است -> Datasheet Atecc508a

مرحله 1: مرحله به مرحله

گام به گام
گام به گام

در این مقاله ، نحوه تغییر پیکربندی این تراشه و نحوه رمزگذاری داده ها با استفاده از الگوریتم AES CBC را به شما نشان خواهم داد.

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

  1. طراحی مدار
  2. پیکربندی این تراشه
  3. استفاده از ماژول AES CBC
  4. چرا باید از این تراشه استفاده کنید

برای هر مرحله ، همه چیز را برای شما شرح خواهم داد. همچنین ، من کد خود را در Github خود با نظرات مربوط به هر عملکرد اضافه کردم. اگر سوالی در مورد کد من یا این پروژه دارید ، خوشحال می شوم به آن پاسخ دهم.

Github من: Github من

مرحله 2: هشدار در مورد Atecc608a

هشدار در مورد Atecc608a
هشدار در مورد Atecc608a

تراشه Atecc608a یک تراشه "آسان" نیست.

اول ، مستندات این تراشه تحت NDA است بنابراین شما آن را به طور کامل در اینترنت پیدا نمی کنید. اما مشکلی در این زمینه وجود ندارد ، برگه داده نسخه قبلی در اینترنت Datasheet Complete ATECC508A موجود است.

دوم ، وقتی از این تراشه استفاده می کنید ، باید پیکربندی آن را قفل کنید و در صورت قفل بودن ، نمی توان پیکربندی تراشه را تغییر داد. بنابراین هنگام قفل کردن Config Zone و Data Zone مراقب باشید.

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

چهار ، کتابخانه نوشت که این تراشه برای Arduino UNO کار نمی کند ، اما به ویژگی های مورد نیاز برای کار با Arduino UNO نیاز دارد.

تراشه ATECC608A

می توانید از طریق I2C با این تراشه ارتباط برقرار کنید. آدرس این تراشه را می توان در پیکربندی تغییر داد.

این تراشه شامل 16 شکاف مختلف است که می تواند شامل انواع مختلفی از داده ها باشد:

  1. کلید ECC (خصوصی یا عمومی)
  2. کلید AES
  3. داده های دیگر (مانند هش Sha یا فقط کلمات)

در مورد ما ، ما AES Key را در یک شکاف ذخیره می کنیم.

مرحله 3: 1. طراحی مدار

1. طراحی مدار
1. طراحی مدار
1. طراحی مدار
1. طراحی مدار

1. طراحی مدار

طرح این مدار بسیار ساده است!

شما باید از برق 3.3 ولت استفاده کنید زیرا توصیه شده بین 2.0 ولت و 5.5 ولت است اما من ترجیح می دهم از 3.3 ولت استفاده کنم.

برای این تراشه ، معمولاً یک نقطه در گوشه ای از تراشه دارید ، این نقطه Pin 1 این برد است. من نمای بالای Atecc608a را با شماره PIN اضافه کردم زیرا SOIC 8 سربی است ، بنابراین تراشه بسیار کوچک است.

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

شما باید از برق 3.3 ولت استفاده کنید زیرا توصیه شده بین 2.0 ولت و 5.5 ولت است اما من ترجیح می دهم از 3.3 ولت استفاده کنم.

من نمای بالای Atecc608a را اضافه کردم زیرا SOIC 8 سربی است بنابراین تراشه بسیار کوچک است. اگر شما ترجیح می دهید ، بنابراین تامین کنندگان مقداری تخته با لحیم تراشه می سازند ، می تواند برای شما راحت تر باشد.

هشدار: در مورد من ، باید یک مقاومت بین SDA آردوینو و چیپ (همچنین برای SDL) اضافه کنم. برای هر کدام یک مقاومت 4.7 کیلو اهم اضافه کردم.

مرحله 4: 2. پیکربندی تراشه (Atecc608a)

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

هشدار: این مرحله بسیار مهم است و اگر قبل از پایان مناطق را قفل کنید ، نمی توانید آنها را تغییر دهید.

همانطور که قبلاً توضیح داده شد ، این تراشه دارای دو منطقه است:

  1. Config Zone
  2. منطقه داده

منطقه پیکربندی دارای اندازه 128 بایت است اما 16 بایت اول قابل تغییر نیست.

برای پیکربندی این تراشه ، دو مرحله را دنبال کنید. بسیار مهم است که هر مرحله را به ترتیب دنبال کنید ، در غیر اینصورت پیکربندی شما کار نمی کند و تراشه شما قفل شده و غیر قابل استفاده می شود. آن مراحل عبارتند از:

  1. ایجاد یک قالب پیکربندی
  2. این الگو را روی تراشه بنویسید
  3. قفل کردن منطقه پیکربندی
  4. کلید AES (128 بیت) خود را در یک شکاف بنویسید
  5. قفل کردن منطقه داده

اطلاعات

در زیر من هر مرحله از پیکربندی را با کد خود توضیح می دهم ، اما جای نگرانی نیست ، من یک مثال کامل از پیکربندی را در Github خود اضافه کردم. من در مورد هر یک از عملکردها نظر می دهم و یک فایل.ino در هر مرحله به ترتیب برای شما در دسترس است.

  • Github من: Github من
  • مسیر نمونه پیکربندی: configuration_example.ino

مرحله اول: یک قالب پیکربندی ایجاد کنید

همانطور که قبلاً توضیح داده شد ، منطقه پیکربندی دارای اندازه 128 بیت است ، اما 16 بیت اول را نمی توان تغییر داد. این منطقه از چندین قسمت تشکیل شده است ، اما برای این پروژه باید فقط 3 قسمت از این منطقه پیکربندی را بدانید:

  1. Bytes 16 -> این آدرس I2C تراشه است
  2. Bytes 20 تا 51 -> در اینجا می توانید نوع شکاف 16 اسلات این تراشه را تغییر دهید
  3. Bytes 96 تا 127 -> در اینجا می توانید نوع کلید یا داده مورد استفاده در هر شکاف را تنظیم کنید.

(اگر به توضیح بیشتر این منطقه نیاز دارید ، لطفاً اسناد را بخوانید (صفحه 13 ، بخش 2.2))

در اینجا ، من هر یک از بایت ها/قسمت هایی از 112 بایت پیکربندی یک تراشه را به تفصیل بیان می کنم. این یک مثال است ، هر تراشه خریداری شده می تواند پیکربندی متفاوتی داشته باشد:

0xC0 ، // آدرس I2C

0x00 ، 0x00 ، 0x00 ، 0x83 ، 0x20 ، // شکاف پیکربندی شکاف 1 0x85 ، 0x20 ، // شکاف پیکربندی شکاف 2 0x8F ، 0x20 ، // شکاف پیکربندی شکاف 3 0xC4 ، 0x8F ، // شیار پیکربندی 4 0x8F ، 0x8F ، // شکاف پیکربندی شکاف 5 0x8F ، 0x8F ، // شکاف پیکربندی شکاف 6 0x9F ، 0x8F ، // شکاف پیکربندی شکاف 7 0x0F ، 0x0F ، // شکاف پیکربندی شکاف 8 0x8F ، 0x0F ، // شکاف پیکربندی شکاف 9 0x8F ، 0x0F ، // شکاف پیکربندی شکاف 10 0x8F ، 0x0F ، // شکاف پیکربندی شکاف 11 0x8F ، 0x0F ، // شکاف پیکربندی شکاف 12 0x8F ، 0x0F ، // شکاف پیکربندی شکاف 13 0x00 ، 0x00 ، // شکاف پیکربندی شکاف 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. Bytes 16 -> این آدرس I2C تراشه است
  2. Bytes 20 تا 51 -> در اینجا می توانید نوع شکاف 16 اسلات این تراشه را تغییر دهید
  3. Byte 96 تا 127 -> در اینجا می توانید نوع کلید یا داده مورد استفاده در هر شکاف را تنظیم کنید.

من نوع پیکربندی را توضیح نمی دهم و اینکه چرا از این دستگاه و نه از دیگری استفاده کردم ، زیرا توضیح همه چیز پیچیده است. در صورت نیاز به اطلاعات بیشتر ، به مستندات مراجعه کنید ، صفحه 16 بخش 2.2.1 برای "SlotConfig" و صفحه 19 بخش 2.2.5 "KeyConfig"

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

برای این ، ما باید قرار دهیم (در صورت نیاز ، می توانید مثال بالا را کپی کنید ، اصلاح در آن انجام شده است):

  1. بایت 36 = 0x8F
  2. بایت 37 = 0x0F
  3. بایت 112 = 0x1A
  4. بایت 113 = 0x00

چرا این پیکربندی را تنظیم کردم: برای هر شکاف این تراشه ، می توانید پارامترهایی را تنظیم کنید تا به تراشه نوع داده ای که ذخیره می شود ، گفته شود. شما چندین پارامتر دارید:

  • اسلات را می توان نوشت یا خواند (اقدام واضح یا رمزگذاری شده)
  • نوع داده های ذخیره شده (کلید ECC ، کلید عمومی ، SHA Hash ، کلید AES …)
  • شکاف می تواند قفل شود
  • تولید کلید مجاز است

با تنظیم بایت 36 و 37 روی "0x0F8F":

  • داده ها را می توان در Clear نوشت
  • محتویات این شکاف محرمانه است و قابل خواندن نیست
  • برای فرمان CheckMac Copy نمی توان از شکاف استفاده کرد

با تنظیم بایت 112 و 113 روی "0x001A":

اسلات می تواند حداکثر چهار کلید متقارن AES 128 بیتی را ذخیره کند (نوع کلید = 0x6)

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

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

اما نگران نباشید ، تا زمانی که پیکربندی قفل نشده باشد ، می توانید پیکربندی خود را تغییر دهید.

در اینجا ، این کد برای نوشتن پیکربندی روی تراشه استفاده می شود:

/** / مختصر تنظیمات جدیدی را برای تراشه بنویسید.

* / param [in] cfg پیکربندی رابط منطقی. برخی از پیکربندی های * از پیش تعریف شده را می توانید در atca_cfgs.h * / param [in] config پیدا کنید Array uint8_t of the configuration (length 112) * / param [in] len اندازه آرایه پیکربندی * / 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)؛ if (status == ATCA_SUCCESS) {// پیکربندی Array را روی تراشه بنویسید // Padding of 16 byte (16 byte first ვერ نوشته) status = 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) {وضعیت ATCA_STATUS ؛ bool lock = false؛ if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) بازگشت ATCA_BAD_PARAM ؛ وضعیت = 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 بایت داده نیاز داریم. بنابراین تصمیم گرفتم در این شکاف روی کلید 16 بایت بنویسم تا اطلاعات 32 بایت داشته باشد.

اکنون ، کد مورد استفاده را به شما نشان خواهم داد:

/** / مختصر کلید AES را در یک شکاف مشخص بنویسید. * / param [in] cfg پیکربندی رابط منطقی. برخی از پیکربندی های * از پیش تعریف شده را می توان در atca_cfgs.h * / param [in] key slot number * / param [in] datakey key array uint8_t * / param [in] len اندازه آرایه کلید * / بازگشت ATCA_SUCCESS به موفقیت ، در غیر این صورت یک کد خطا است. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg ، کلید uint8_t ، uint8_t *datakey ، size_t len) {if (key 16) ATCA_BAD_PARAM را برمی گرداند ؛ اگر (len! = 32) ATCA_BAD_PARAM را برگردانید ؛ وضعیت ATCA_STATUS = atcab_init (cfg) ؛ if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA، (uint16_t) key، 0، 0، datakey، 32)؛ if (وضعیت! = ATCA_SUCCESS) وضعیت بازگشت ؛ } وضعیت بازگشت ؛ }

برای این مثال ، من از دو کلید AES با حجم 16 بایت استفاده می کنم:

// مثال AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"؛ 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) {وضعیت ATCA_STATUS ؛ bool lock = false؛ if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) بازگشت ATCA_BAD_PARAM ؛ وضعیت = 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 است. این الگوریتم از یک Vector اولیه برای رمزگذاری داده های شما استفاده می کند.

اطلاعات

در زیر هر مرحله از روش رمزگذاری و رمزگشایی را توضیح می دهم. اما من یک کد برای آردوینو نوشتم که از هر دو عملکرد استفاده می کند. شما می توانید این کد را در Github من مشاهده کنید:

  • Github: Github من
  • مثال کد "رمزگذاری/رمزگشایی": AES_crypto_example.ino

مرحله اول: داده های خود را رمزگذاری کنید

در این قسمت ، نحوه رمزگذاری داده های خود را به شما نشان خواهم داد.

ابتدا به این عملکرد نیاز دارید:

/** / مختصر رمزگذاری داده ها با استفاده از الگوریتم AES CBC* / param [in] cfg پیکربندی رابط منطقی. برخی از پیکربندی های * از پیش تعریف شده را می توان در atca_cfgs.h * / param [در] داده ها یافت. کلمات برای رمزگذاری (باید بر 16 تقسیم شود ، حداکثر طول 240) * / param [در] طول کلمات به رمزگذاری (باید بر 16 تقسیم شود ، حداکثر طول 240) * / param [out] iv بردار اولیه مورد استفاده در AES CBC (بردار را در این var برگردانید) * / param [out] ciphertext متن Cypher * / param [in] key slot number of the کلید * / بازگشت موفقیت آمیز 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؛ if (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) ؛ if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx، key، 0، tmp_iv)؛ if (وضعیت! = ATCA_SUCCESS) {Serial.print (F ("رمزگذاری ERROR: atcab_aes_cbc_init ، کد خطا 0x")) ؛ Serial.println (وضعیت ، HEX) ؛ برگشت؛ } memcpy (iv، tmp_iv ، IV_LENGTH_CBC) ؛ memcpy (tmp_data ، data ، len) ؛ int max = 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 ، کد خطا 0x")) ؛ Serial.println (وضعیت ، HEX) ؛ } وضعیت بازگشت ؛ } وضعیت بازگشت ؛ }

استفاده از این عملکرد ساده است ، شما باید دو مورد را تنظیم کنید:

  1. IV خالی (بردار اولیه) 16 بایت
  2. رمزگذاری داده ها (حداکثر اندازه 240 بایت)

در اینجا یک مثال "نحوه استفاده از این تابع".

من می خواهم کلمه "AAAAAAAAAAAAAA" را رمزگذاری کنم ، در حالی که کلید من در شکاف شماره "9" نوشته شده است:

وضعیت ATCA_STATUS = atcab_init (& cfg)؛ if (وضعیت! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () failed: Code -> 0x"))؛ Serial.println (وضعیت ، HEX) ؛ } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"؛ // متن اصلی uint8_t iv [IV_LENGTH_CBC] ؛ // بردار اولیه uint8_t cypherdata [sizeof (متن ساده)] ؛ // وضعیت رمزگذاری داده = aes_cbc_encrypt (& cfg ، متن ساده ، اندازه (ساده متن) ، iv ، cypherdata ، 9) ؛

اگر عملکرد خوب باشد ، داده های رمزگذاری شده را در متغیر "cypherdata" و بردار اولیه را در متغیر "IV" خواهید داشت.

آن دو متغیر را برای رمزگشایی متن خود نگه دارید!

مرحله دوم: رمزگشایی اطلاعات

برای رمزگشایی اطلاعات خود به دو چیز نیاز دارید:

  1. بردار اولیه
  2. داده های Cypher (داده های رمزگذاری شده)

برای رمزگشایی داده های خود ، به این تابع نیاز دارید:

/** / مختصر رمزگشایی داده ها با استفاده از الگوریتم AES CBC* / param [in] cfg پیکربندی رابط منطقی. برخی از پیکربندی های * از پیش تعریف شده را می توانید در atca_cfgs.h * / param [in] ciphertext پیدا کنید کلمات برای رمزگشایی (باید بر 16 تقسیم شود ، حداکثر طول 240) * / param [در] طول کلمات به رمزگشایی (باید بر 16 تقسیم شود ، حداکثر طول 240) * / param [in] iv Vector اولیه برای استفاده در AES CBC * / param [out] plaintext متن رمزگشایی شده را اینجا * / param [در] کلید اسلات کلید * * بازگشت 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؛ if (len> LIMIT_DATA_SIZE_CBC || len٪ 16! = 0) {Serial.print (F ("ERROR رمزگشایی: ATCA_BAD_PARAM")) ؛ بازگشت ATCA_BAD_PARAM ؛ } وضعیت ATCA_STATUS = atcab_init (cfg)؛ if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx، key، 0، iv)؛ if (وضعیت! = 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 ، کد خطا 0x")) ؛ Serial.println (وضعیت ، HEX) ؛ } وضعیت بازگشت ؛ } وضعیت بازگشت ؛ }

من می خواهم داده های قبلی خود را رمزگشایی کنم (به پایین ، مرحله اول مراجعه کنید). برای این کار این کار را می کنم:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"؛ uint8_t iv [IV_LENGTH_CBC] ؛ uint8_t cypherdata [sizeof (متن ساده)]؛ uint8_t رمزگشایی داده ها [sizeof (متن ساده)]؛ status = aes_cbc_decrypt (& cfg، cypherdata، sizeof (cypherdata)، iv، decryptdata، 9)؛ if (status == ATCA_SUCCESS) {Serial.print ("متن رمزگشایی شده است:") ؛ برای (size_t i = 0 ؛ i <sizeof (decryptdata) ؛ i ++) {Serial.print ((char) decryptdata ) ؛ } Serial.println ("")؛ } else {// برای کد Error Serial.print به فایل atca_status.h مراجعه کنید (F ("رمزگشایی غیر ممکن است | کد خطا 0x")) ؛ Serial.println (وضعیت ، HEX) ؛ برگشت؛ }

اگر عملکرد خوب باشد ، داده های رمزگشایی شده را در متغیر "decryptdata" خواهید داشت.

اکنون می دانید که چگونه از رمزگذاری و رمزگشایی با تراشه Atecc608a استفاده کنید

مرحله 6: 5. چرا باید از این تراشه استفاده کنید

داده های رمزگذاری شده بسیار مفید هستند زیرا می توانید اطلاعات خود را مخفی کرده و توسط Wireless ارسال کنید یا فقط آنها را ذخیره کنید.

در اینجا چند مثال از استفاده:

  1. داده های ذخیره شده در یک EEPROM خارجی: می توانید داده های یک EEPROM خارجی را ایمن کنید و اگر کسی این EEPROM را حفظ کرد ، برای رمزگشایی به کلید و IV نیاز دارد.
  2. ارسال داده های بی سیم: می توانید این داده های رمزگذاری شده را توسط Wireless (nrf24L01 ، RFM95W …) ارسال کنید و اگر شخصی داده های شما را رهگیری کند ، این داده ها ایمن خواهند بود
  3. رمز ذخیره شده

با این تراشه می توانید چندین کار را انجام دهید. می توان از آن در پروژه های متعدد استفاده کرد. اگر وقت دارید به من بگویید در چه پروژه ای از این تراشه استفاده خواهید کرد؟

یک توصیه آخر ، اگر پروژه بی سیم می سازید یا داده های خام ذخیره می کنید ، مراقب باشید ، امنیت بسیار مهم است و اگر می دانید که چگونه یک "noob" به راحتی می تواند داده های شما را رهگیری یا سرقت کند. در حال حاضر با استفاده از اینترنت ، همه می توانند اسکریپت هایی برای راه اندازی روی رایانه خود داشته باشند تا شما را "هک" کنند!

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

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

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

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

توصیه شده: