Mundarija:

Arduino bilan xavfsizlik: Atecc608a: 7 qadam
Arduino bilan xavfsizlik: Atecc608a: 7 qadam

Video: Arduino bilan xavfsizlik: Atecc608a: 7 qadam

Video: Arduino bilan xavfsizlik: Atecc608a: 7 qadam
Video: Робот на Arduino Nano #ардуино #роботы #электроника 2024, Iyul
Anonim
Arduino bilan xavfsizlik: Atecc608a
Arduino bilan xavfsizlik: Atecc608a
Arduino bilan xavfsizlik: Atecc608a
Arduino bilan xavfsizlik: Atecc608a

Mavzu

Hammaga salom !

Bu mening birinchi ko'rsatma maqolam, shuning uchun umid qilamanki, bu hammangiz uchun qiziqarli bo'ladi.

Ushbu maqolada men sizga bir nechta xavfsizlik vositalarini ta'minlaydigan "ATECC608A" deb nomlangan mikro chipdan qanday foydalanishni tushuntiraman.

Bu chip MicroChip tomonidan ishlab chiqilgan va "CryptoAuthentication chip" ning oxirgi versiyasidir. Ushbu versiyadan oldin "ATSHA204A" va "ATECC508A" mavjud edi.

Nega men oldingi versiyani emas, balki oxirgi versiyani ishlatishga qaror qildim?

Bu versiya eng ilg'or chip bo'lib, u eski versiyada bo'lmagan funktsiyalarga ega (masalan: AES moduli, IO himoya moduli …).

Nima uchun bu loyiha?

Men CyberSecurity domenida ishlayman va hamma dasturlash va elektronikani yaxshi ko'rardi. O'qish davomida men IoT xavfsizligi bo'yicha mutaxassis bilan konferentsiya o'tkazaman, u bizga Sanoat IoT ob'ektida Xavfsizlikni ishlatmasligini ko'rsatdi. Men sizga smartfon bilan Bluetooth orqali ochiladigan qulfni ko'rsatdim. Qulf qulfida "Bu qulf kalit qulfdan ko'ra eng xavfsiz!" Degan jumla bor. Bu jumla uni tabassumga soladi va "Bu qulf - bu qurilgan eng yomon qulf!" Jumlasini o'zgartirdi.

U bizga o'z shaxsiy kompyuteri va Bluetooth -snayper bilan ko'rsatdi, har safar smartfon yuborgan har bir buyruq bir xil bo'ladi va bu buyruqni nusxalash va uni smartfon bilan yuborish juda oddiy. U bizga "sanoat" uchun "xavfsizlik" asosiy muammo emasligini tushuntirdi. U bizga bu ob'ektlarga xavfsizlik qatlamini qo'sha oladigan chiplarni (0,60 $ dan kam) ko'rsatdi.

Ushbu namoyishdan so'ng, men IoT ob'ektiga xavfsizlik qatlamini qo'shadigan ochiq manbali loyihani topishga harakat qildim, lekin uni topa olmadim.

Shuning uchun men ikkita IoT obyekti o'rtasida aloqa uchun xavfsizlik qatlamini ishlatadigan loyiha ustida ishlashga qaror qildim.

Mening fikrim nima?

Ikkita IoT ob'ekti o'rtasida aloqa paytida bir nechta hujumlar bo'lishi mumkin: Oddiy odam, ma'lumotlarning nusxasi va boshqalar. Shunday qilib, mening fikrim juda oddiy:

  1. Ikki yoki undan ortiq IoT ob'ektlari o'rtasida shifrlangan ma'lumotlardan foydalanish.
  2. Arzon narxdagi materiallar
  3. Arduino UNO bilan ishlashi mumkin

Endi men sizga bu mavhum rasmni Arduino va Atecc608a chipi yordamida qanday amalga oshirganimni tushuntirib beraman. Ushbu maqolada men sizga Arduino UNO -ni ATECC608A bilan qanday ishlatishni tushuntiraman.

Keyingi safar men ikkita ob'ektning aloqasi haqida maqola yozaman.

Ta'minotlar

Ushbu loyiha uchun sizga bir nechta narsalar kerak bo'ladi:

  1. Arduino UNO yoki MEGA (chip Atmega 328 yoki ATMEGA 2560 bo'lishi kerak)
  2. Atecc608A chipi (har birining narxi 0,80 dollardan past, etkazib beruvchining veb -saytida topish oson)
  3. 8 pinli SOIC adapteri
  4. Ba'zi simlar va rezistorlar

Bu chipning oldingi versiyasi (Atecc508a) ma'lumotlar sahifasi bu erda -> Atecc508a ma'lumotlar jadvali.

1 -qadam: Bosqichma -bosqich

Qadam ba qadam
Qadam ba qadam

Ushbu maqolada men sizga ushbu chip konfiguratsiyasini qanday o'zgartirish kerakligini va AES CBC algoritmi yordamida ma'lumotlarni qanday shifrlashni ko'rsataman.

Biz bu bosqichlarni bajaramiz:

  1. Zanjirning dizayni
  2. Bu chip konfiguratsiyasi
  3. AES CBC modulidan foydalanish
  4. Nega bu chipdan foydalanish kerak?

Har bir qadam uchun men siz uchun hamma narsani batafsil aytib beraman. Bundan tashqari, men o'z kodimni Github -ga har bir funktsiya uchun sharhlar bilan qo'shdim. Agar sizda mening kodim yoki ushbu loyiha haqida savollaringiz bo'lsa, men javob berishdan xursand bo'laman.

Mening Gitubim: Mening Gitubim

2 -qadam: Atecc608a haqida ogohlantirish

Atecc608a haqida ogohlantirish
Atecc608a haqida ogohlantirish

Atecc608a chipi "oson" chip emas.

Birinchidan, ushbu chipning hujjatlari NDA ostida, shuning uchun uni Internetda to'liq topa olmaysiz. Ammo buning hech qanday muammosi yo'q, oldingi versiyaning ma'lumotlar varaqasi ATECC508A Internet ma'lumotlar jadvalida mavjud.

Ikkinchidan, ushbu chipdan foydalanganda siz uning konfiguratsiyasini qulflashingiz kerak va agar u qulflangan bo'lsa, uning konfiguratsiyasini o'zgartirish mumkin emas. Konfiguratsiya zonasi va ma'lumotlar zonasini qulflashda ehtiyot bo'ling.

Uchinchidan, C tilida yozilgan kutubxona juda katta va to'liq, shuning uchun siz ilgari ishlatadigan funktsiyalarning hujjatlarini o'qishingiz kerak.

To'rtinchidan, kutubxona bu chip uchun Arduino UNO uchun ishlamasligini yozdi, lekin u Arduino UNO bilan ishlash uchun zarur bo'lgan funktsiyalarni qo'shdi.

ATECC608A chipi

Siz bu chip bilan I2C orqali muloqot qilishingiz mumkin. Ushbu chipning manzilini konfiguratsiyada o'zgartirish mumkin.

Bu chipda har xil turdagi ma'lumotlarni o'z ichiga oladigan 16 xil uyalar mavjud:

  1. ECC kaliti (shaxsiy yoki ochiq)
  2. AES kaliti
  3. Boshqa ma'lumotlar (masalan, Sha xash yoki oddiy so'zlar)

Bizning holatda, biz AES kalitini bitta uyada saqlaymiz.

3 -qadam: 1. O'chirish sxemasi

1. O'chirish sxemasi
1. O'chirish sxemasi
1. O'chirish sxemasi
1. O'chirish sxemasi

1. O'chirish sxemasi

Ushbu sxemaning sxemasi juda oddiy!

Siz 3,3 V quvvatni ishlatishingiz kerak, chunki tavsiya 2,0 dan 5,5 V gacha, lekin men 3,3 V dan foydalanishni ma'qul ko'rdim.

Bu chip uchun, odatda, chipning burchagida nuqta bor, bu nuqta bu taxtaning 1 -pinidir. Men PIN kodli Atecc608a-ning yuqori ko'rinishini qo'shdim, chunki u 8-simli SOIC, shuning uchun chip juda kichik.

  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)

Siz 3,3 V quvvatni ishlatishingiz kerak, chunki tavsiya 2,0 dan 5,5 V gacha, lekin men 3,3 V dan foydalanishni ma'qul ko'rdim.

Men Atecc608a-ning yuqori ko'rinishini qo'shdim, chunki u 8-etakchi SOIC, shuning uchun chip juda kichik. Agar xohlasangiz, etkazib beruvchilar chip lehim bilan taxta yasashadi, bu sizga osonroq bo'lishi mumkin.

Ogohlantirish: Menimcha, men Arduino va Chip SDA (shuningdek, SDL uchun) o'rtasida qarshilik qo'shishim kerak. Men har biriga 4,7 kohmlik rezistor qo'shdim.

4 -qadam: 2. Chip konfiguratsiyasi (Atecc608a)

Shifrlash yoki shifrlash funktsiyasidan foydalanishdan oldin siz chipni sozlashingiz kerak. Ushbu bosqichda men ushbu chipni sozlash uchun kerak bo'lgan barcha qadamlarni batafsil bayon qilaman.

Ogohlantirish: bu qadam juda muhim va agar siz zonalarni oxirigacha qulflasangiz, ularni o'zgartira olmaysiz.

Yuqorida aytib o'tilganidek, bu chip ikkita zonaga ega:

  1. Konfiguratsiya zonasi
  2. Ma'lumotlar zonasi

Konfiguratsiya zonasi 128 bayt hajmga ega, lekin birinchi 16 baytni o'zgartirib bo'lmaydi.

Ushbu chipni sozlash uchun siz ikkita qadamni bajarishingiz kerak. Har bir qadamni tartibda bajarish juda muhim, aks holda sizning konfiguratsiyangiz ishlamaydi va sizning chipingiz qulflanadi va yaroqsiz bo'ladi. Bu qadamlar:

  1. Konfiguratsiya shablonini yarating
  2. Ushbu shablonni chipga yozing
  3. Konfiguratsiya zonasini qulflang
  4. AES kalitini (128 bit) uyaga yozing
  5. Ma'lumotlar zonasini qulflang

Ma `lumot

Quyida men konfiguratsiyaning har bir bosqichini o'z kodim bilan batafsil bayon qilaman, lekin xavotirlanmayman, men Github -ga konfiguratsiyaning to'liq misolini qo'shdim. Men har bir funktsiyaga izoh beraman va har bir qadamda *.ino fayli mavjud.

  • Mening Gitubim: Mening Gitubim
  • Misol konfiguratsiyasi yo'li: configuration_example.ino

Birinchi qadam: konfiguratsiya shablonini yarating

Yuqorida aytib o'tilganidek, konfiguratsiya zonasi 128 bit hajmga ega, lekin birinchi 16 bitni o'zgartirib bo'lmaydi. Bu zona bir nechta qismlardan iborat, lekin siz ushbu loyiha uchun ushbu konfiguratsiya zonasining faqat 3 qismini bilishingiz kerak:

  1. Bytes 16 -> Bu chipning I2C manzili
  2. Bayt 20 dan 51 gacha -> Siz bu chipning 16 uyasi uchun uyaning turini o'zgartirishingiz mumkin
  3. Bayt 96 dan 127 gacha -> Siz bu erda har bir uyada ishlatiladigan kalit yoki ma'lumot turini belgilashingiz mumkin.

(Agar sizga ushbu zonaning batafsil tavsifi kerak bo'lsa, hujjatlarni o'qing (13 -bet, 2.2 -bo'lim))

Bu erda men chip konfiguratsiyasining 112 baytli har bayt/qismlarini batafsil bayon qildim. Bu misol, har bir chip har xil konfiguratsiyaga ega bo'lishi mumkin:

0xC0, // I2C manzili

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config uyasi 1 0x85, 0x20, // Slot Config uyasi 2 0x8F, 0x20, // Slot Config uyasi 3 0xC4, 0x8F, // Slot Config uyasi 4 0x8F, 0x8F, // Slot Config uyasi 5 0x8F, 0x8F, // Slot Config uyasi 6 0x9F, 0x8F, // Slot Config uyasi 7 0x0F, 0x0F, // Slot konfiguratsiya uyasi 8 0x8F, 0x0F, // Slot konfiguratsiya uyasi 9 0x8F, 0x0F, // Slot Config uyasi 10 0x8F, 0x0F, // Slot konfiguratsiya uyasi 11 0x8F, 0x0F, // Slot konfiguratsiya uyasi 12 0x8F, 0x0F, // Slot konfiguratsiya uyasi 13 0x00, 0x00, // Slot konfiguratsiya uyasi 14 0x00, 0x00, // Slot Config uyasi 15 0xAF, 0x8F, // Slot konfiguratsiya uyasi 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, // Kalit konfiguratsiya uyasi 1 0x33, 0x00, // kalit konfiguratsiya uyasi 2 0x33, 0x00, // kalit konfiguratsiya uyasi 3 0x1C, 0x00, // kalit konfiguratsiya uyasi 4 0x1C, 0x00, // Kalit konfiguratsiya uyasi 5 0x 1C, 0x00, // Kalit konfiguratsiya uyasi 6 0x1C, 0x00, // kalit konfiguratsiya uyasi 7 0x3C, 0x00, // kalit konfiguratsiya uyasi 8 0x1A, 0x00, // kalit konfiguratsiya uyasi 9 0x3A, 0x00, // kalit konfiguratsiya uyasi 10. 0x1A, 0x00, // kalit konfiguratsiya uyasi 11 0x3A, 0x00, // kalit konfiguratsiya uyasi 12 0x3A, 0x00, // kalit konfiguratsiya uyasi 13 0x3C, 0x00, // kalit konfiguratsiya uyasi 14 0x3C, 0x00, // kalit konfiguratsiya uyasi 15. 0x1C, 0x00 // Kalit konfiguratsiya uyasi 16

Ko'rib turganingizdek, men ushbu konfiguratsiyani tushunish uchun ushbu kodga ba'zi sharhlar yozdim.

Sizning holatingizda faqat uchta narsani tushunish kerak:

  1. Bytes 16 -> Bu chipning I2C manzili
  2. Bayt 20 dan 51 gacha -> Siz bu chipning 16 uyasi uchun uyaning turini o'zgartirishingiz mumkin
  3. Bayt 96 dan 127 gacha -> Siz bu erda har bir uyada ishlatiladigan kalit yoki ma'lumot turini belgilashingiz mumkin.

Men konfiguratsiya turini tushuntirmayman va nima uchun men buni ishlatganman, boshqasini emas, chunki hamma narsani tushuntirish qiyin. Agar sizga ko'proq ma'lumot kerak bo'lsa, hujjatlarga o'ting, "SlotConfig" uchun 2.2.1 -bo'lim, "KeyConfig" uchun 19 -sahifa 2.2.5.

Bu misol uchun siz AES kalitini saqlash uchun 9 -uyadan foydalanasiz.

Buning uchun biz qo'yishimiz kerak (agar kerak bo'lsa, yuqoridagi misolni nusxalashingiz mumkin, unda o'zgartirish kiritilgan):

  1. Bayt 36 = 0x8F
  2. Bayt 37 = 0x0F
  3. Bayt 112 = 0x1A
  4. Bayt 113 = 0x00

Nima uchun men bu konfiguratsiyani o'rnatdim: bu chipning har bir uyasi uchun siz qanday ma'lumotlarni saqlashini chipga aytadigan parametrlarni o'rnatishingiz mumkin. Sizda bir nechta parametrlar mavjud:

  • Slot yozilishi yoki o'qilishi mumkin (tozalash yoki shifrlash)
  • Saqlangan ma'lumotlar turi (ECC kaliti, ochiq kalit, SHA Hash, AES kaliti …)
  • Slot qulflanishi mumkin
  • Kalitni yaratishga ruxsat beriladi

36 va 37 baytlar "0x0F8F" ga o'rnatilganda:

  • Ma'lumotlar Clear -da yozilishi mumkin
  • Bu uyaning mazmuni maxfiy bo'lib, uni o'qib bo'lmaydi
  • CheckMac Copy buyrug'i uchun uyadan foydalanib bo'lmaydi

112 va 113 baytlari "0x001A" ga o'rnatilganda:

Slot to'rtta AES 128 bitli nosimmetrik kalitlarni saqlashi mumkin (KeyType = 0x6)

Ikkinchi qadam: Ushbu konfiguratsiyani yozing

Bu qadam juda muhim, chunki biz o'z konfiguratsiyamiz bilan chipni o'rnatamiz va agar bu konfiguratsiya yaxshi bo'lmasa, siz bu chipdan foydalanasiz.

Xavotir olmang, chunki konfiguratsiya qulflanmagan bo'lsa, siz konfiguratsiyani o'zgartirishingiz mumkin.

Bu erda konfiguratsiyani chipga yozish uchun ishlatiladigan kod:

/** / qisqacha Chipga yangi konfiguratsiyani yozing.

* / param [in] cfg mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h * / param [in] config konfiguratsiyasining uint8_t qatorida (uzunlik 112) * / param [in] len konfiguratsiya massivining o'lchami * / ATCA_SUCCESS muvaffaqiyatga qaytadi, aks holda xato kodi. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) ATCA_BAD_PARAM; ATCA_STATUS holati; holat = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Array konfiguratsiyasini chipga yozish // 16 baytni to'ldirish (16 birinchi baytni yozib bo'lmaydi) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); qaytish holati; } qaytish holati; }

Bu funksiya sizning konfiguratsiyangizni chipga yozadi.

Uchinchi qadam: konfiguratsiya zonasini qulflash

Ogohlantirish: bu qadamda ehtiyot bo'ling, agar siz ushbu zonani qulflasangiz va konfiguratsiyangiz yaxshi bo'lmasa, chip yaroqsiz va siz bu zonani o'zgartira olmaysiz

Ushbu harakat uchun biz ushbu funktsiyadan foydalanamiz:

/** / qisqacha DATA_ZONE yoki CONFIG_ZONE qulflanganligini tekshiring

* / param [in] cfg mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h * / param [in] LOCK_ZONE_DATA zonasida yoki LOCK_ZONE_CONFIG * / ATCA_SUCCESS -ni muvaffaqiyat bilan qaytarish mumkin, aks holda xato kodi. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zonasi) {ATCA_STATUS holati; bool lock = noto'g'ri; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM; holat = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {qaytish ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS -ni qaytarish; } qaytish ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

To'rtinchi qadam: AES kalitini uyaga yozing

Bu qismda siz chip konfiguratsiyasida siz belgilagan uyaga shaxsiy AES kalitini o'rnatasiz.

Bu misol uchun men chipning 9 -uyasidan foydalanaman.

Siz bilishingiz kerak: Ushbu chipning o'ziga xos xususiyati shundaki, siz ma'lumotlarni uyaga faqat 4 bayt yoki 32 baytga yozishingiz mumkin. AES uchun bizga 128 bitli kalit kerak, shuning uchun 16 bayt ma'lumot. Shunday qilib, men 32 baytli ma'lumotga ega bo'lish uchun har bir uyada 16 baytdan iborat kalit yozishga qaror qildim.

Endi men sizga ishlatilgan kodni ko'rsataman:

/** / qisqacha AES kalitini berilgan uyaga yozing. * / param [in] cfg mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h dan topish mumkin aks holda xato kodi. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t kaliti, uint8_t *datakey, size_t len) {if (16 -kalit) ATCA_BAD_PARAM -ni qaytaradi; agar (len! = 32) ATCA_BAD_PARAM qaytsa; ATCA_STATUS holati = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) kaliti, 0, 0, datakey, 32); agar (status! = ATCA_SUCCESS) qaytish holati; } qaytish holati; }

Bu misol uchun men har biri 16 baytlik ikkita AES kalitidan foydalanaman:

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

Agar bu harakat yaxshi bo'lsa, endi siz "ma'lumotlar zonasini qulflash" ning oxirgi bosqichidan o'tishingiz kerak.

Oxirgi qadam: ma'lumotlar zonasini qulflash

Ogohlantirish: bu qadamda ehtiyot bo'ling, agar siz ushbu zonani qulflasangiz va ma'lumotlaringiz sozlanmagan bo'lsa, chip yaroqsiz va siz bu zonani o'zgartira olmaysiz

Ushbu harakat uchun biz ushbu funktsiyadan foydalanamiz:

/** / qisqacha DATA_ZONE yoki CONFIG_ZONE qulflanganligini tekshiring

* / param [in] cfg mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h * / param [in] LOCK_ZONE_DATA zonasida yoki LOCK_ZONE_CONFIG * / ATCA_SUCCESS -ni muvaffaqiyat bilan qaytarish mumkin, aks holda xato kodi. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zonasi) {ATCA_STATUS holati; bool lock = noto'g'ri; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM; holat = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {qaytish ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS -ni qaytarish; } qaytish ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Agar bu harakat yaxshi bo'lsa, sizning chipingiz foydalanishga tayyor

5 -qadam: 3. AES CBC modulidan foydalanish

3. AES CBC modulidan foydalanish
3. AES CBC modulidan foydalanish

Men AES CBC algoritmi va Atecc608a chipi yordamida ma'lumotlarni qanday shifrlash va parolini ochishni tushuntiraman.

Esingizda bo'lsin: bu funktsiyani ishlatishdan oldin siz chipni sozlashingiz kerak. Buning uchun ushbu maqolaning 2 -bosqichini bajaring

Bu chip bir nechta turdagi AES moduliga ega (AES 128 bit), faqat AES 128 bit bo'lishi mumkin:

  1. AES normal
  2. AES CBC
  3. AES GCM (GFM xash bilan) (batafsil tushuntirish uchun Vikipediyaga qarang)

Foydalanishni osonlashtirish uchun men ikkita funktsiyani yaratdim:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Bu ikkita funktsiya mening Github -da mavjud.

Tushuntirish

Men AES CBC algoritmini ishlatishni tanladim, chunki u asosiy AES 128 bitdan ko'ra xavfsizroq. Ushbu algoritm ma'lumotlaringizni shifrlash uchun boshlang'ich vektordan foydalanadi.

Ma `lumot

Quyida men shifrlash va shifrlash usulining har bir bosqichini batafsil bayon qilaman. Ammo men ikkala funktsiyani ishlatadigan Arduino uchun kod yozdim. Siz bu kodni Github -da ko'rishingiz mumkin:

  • Github: Mening Github
  • "Shifrlash/parolini ochish" kodiga misol: AES_crypto_example.ino

Birinchi qadam: ma'lumotlarni shifrlash

Ushbu bo'limda men sizga ma'lumotlarni qanday shifrlashni ko'rsataman.

Birinchidan, sizga bu funktsiya kerak bo'ladi:

/** / qisqacha AES CBC algoritmi yordamida ma'lumotlarni shifrlash* / param [in] cfg Mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h dan topish mumkin, maksimal uzunlik 240) * / param [out] iv AES CBC -da ishlatilgan boshlang'ich vektor (bu varaqdagi vektorni qaytarish) * / param [out] shifrli matn bu erga shifr matni * / param [in] tugmachasining uyasi raqami kalit * / muvaffaqiyatli ATCA_SUCCESS -ni qaytaring, aks holda xato kodi. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *ma'lumotlar, int len, uint8_t *iv, uint8_t *shifrli matn, uint8_t kaliti) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("XATO: ATCA_BAD_PARAM")); qaytish ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS holati = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, 0x kod xatosi")); Serial.println (holati, HEX); qaytish; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, ma'lumotlar, len); int max = len / 16; uchun (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], va shifrli matn [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, 0x kod xatosi")); Serial.println (holati, HEX); } qaytish holati; } qaytish holati; }

Bu funktsiyadan foydalanish oson, siz ikkita narsani o'rnatishingiz kerak:

  1. 16 baytli bo'sh IV (boshlang'ich vektor)
  2. Shifrlash uchun ma'lumotlar (maksimal hajmi 240 bayt)

Bu erda "bu funktsiyadan qanday foydalanish kerak" misoli.

Men kalitni "9" uyasiga yozgan holda "AAAAAAAAAAAAAAA" so'zini shifrlamoqchiman:

ATCA_STATUS holati = atcab_init (& cfg); agar (holat! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () bajarilmadi: Kod -> 0x")); Serial.println (holati, HEX); } uint8_t oddiy matn [16] = "AAAAAAAAAAAAAAAA"; // Asl matn uint8_t iv [IV_LENGTH_CBC]; // boshlang'ich vektor uint8_t cypherdata [sizeof (oddiy matn)]; // Ma'lumotlarning shifrlangan holati = aes_cbc_encrypt (& cfg, aniq matn, sizeof (ochiq matn), iv, cherherata, 9);

Agar harakat yaxshi bo'lsa, "shifrlangan ma'lumotlar" o'zgaruvchisida shifrlangan ma'lumotlar va "IV" o'zgaruvchisida boshlang'ich vektor bo'ladi.

Matnni hal qilish uchun bu ikkita o'zgaruvchini saqlang!

Ikkinchi qadam: ma'lumotlarni shifrdan chiqarish

Ma'lumotni shifrdan chiqarish uchun sizga ikkita narsa kerak bo'ladi:

  1. Dastlabki vektor
  2. Shifrlangan ma'lumotlar (shifrlangan ma'lumotlar)

Ma'lumotlarni shifrini ochish uchun sizga bu funksiya kerak bo'ladi:

/** / qisqacha AES CBC algoritmi yordamida ma'lumotlarni shifrini ochish* / param [in] cfg Mantiqiy interfeys konfiguratsiyasi. Ba'zi oldindan belgilangan * konfiguratsiyalarni atca_cfgs.h dan topish mumkin, maksimal uzunlik 240) * / param [in] iv AES CBC -da foydalanish uchun boshlang'ich vektor * / param [chiqish] ochiq matn bu erga shifrlangan matnni qaytaradi * / param [in] tugmachasining uyasi raqami * / qaytish ATCA_SUCCESS muvaffaqiyatga erishadi., aks holda xato kodi. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *shifrli matn, int len, uint8_t *iv, uint8_t *oddiy matn, uint8_t kaliti) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR decrypt: ATCA_BAD_PARAM")); qaytish ATCA_BAD_PARAM; } ATCA_STATUS holati = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, 0x kod xatosi")); Serial.println (holati, HEX); qaytish; } int max = len / 16; uchun (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & opentext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR decrypt: atcab_aes_cbc_encrypt_block, 0x kod xatosi")); Serial.println (holati, HEX); } qaytish holati; } qaytish holati; }

Men oldingi ma'lumotlarning parolini ochmoqchiman (pastga qarang, birinchi qadam). Buning uchun men buni qilaman:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t shifrlangan ma'lumotlar [sizeof (oddiy matn)]; uint8_t dekryptdata [sizeof (oddiy matn)]; status = aes_cbc_decrypt (& cfg, cypheratata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Shifrlangan matn bu:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Erca Serial.print kodi uchun atca_status.h faylini ko'ring (F ("Shifrni ochish mumkin emas | Kod xatosi 0x")); Serial.println (holati, HEX); qaytish; }

Agar harakat yaxshi bo'lsa, siz "decryptdata" o'zgaruvchisida shifrlangan ma'lumotlarni olasiz.

Endi siz Atecc608a chipi yordamida shifrlash va dekodlashni qanday ishlatishni bilasiz

6 -qadam: 5. Nima uchun bu chipdan foydalanish kerak

Shifrlangan ma'lumotlar juda foydalidir, chunki siz o'z ma'lumotlaringizni yashirib, Simsiz tarmoq orqali yuborishingiz yoki shunchaki saqlashingiz mumkin.

Mana, foydalanish misollari:

  1. Tashqi EEPROMda saqlangan ma'lumotlar: Siz tashqi EEPROM ma'lumotlarini himoyalashingiz mumkin va agar kimdir bu EEPROM bo'lsa, unga parolni hal qilish uchun kalit va IV kerak bo'ladi.
  2. Simsiz ma'lumotlarni yuborish: Siz ushbu shifrlangan ma'lumotlarni Simsiz (nrf24L01, RFM95W …) orqali yuborishingiz mumkin va agar kimdir sizning ma'lumotlaringizga to'sqinlik qilsa, bu ma'lumotlar xavfsiz bo'ladi.
  3. Saqlangan parol

Ushbu chip yordamida siz ko'p narsalarni qilishingiz mumkin. U bir nechta loyihalarda ishlatilishi mumkin. Agar vaqtingiz bo'lsa, ayting -chi, bu loyihani qaysi loyihada ishlatasiz?

Oxirgi maslahat, agar siz simsiz loyihani qursangiz yoki ba'zi ma'lumotlarni saqlasangiz, ehtiyot bo'ling, xavfsizlik juda muhim va agar siz "noob" ning sizning ma'lumotlaringizni ushlab qolish yoki o'g'irlashi qanchalik osonligini bilsangiz. Endi Internet bilan har kim o'z kompyuterida sizni "buzish" uchun ishga tushirish uchun skriptlarga ega bo'lishi mumkin!

7 -qadam: Xulosa

Umid qilamanki, bu maqola siz uchun foydali bo'ladi. Kechirasiz, agar men matnda xato qilgan bo'lsam, lekin ingliz tili mening asosiy tilim emas va men yozganimdan yaxshiroq gapiraman.

Hamma narsani o'qiganingiz uchun tashakkur.

Bundan bahra oling.

Tavsiya: