Агуулгын хүснэгт:

Arduino -тай аюулгүй байдал: Atecc608a: 7 алхам
Arduino -тай аюулгүй байдал: Atecc608a: 7 алхам

Видео: Arduino -тай аюулгүй байдал: Atecc608a: 7 алхам

Видео: Arduino -тай аюулгүй байдал: Atecc608a: 7 алхам
Видео: КИБЕР ОРОН ЗАЙ ДАХЬ АЮУЛГҮЙ БАЙДАЛ 2024, Долдугаар сарын
Anonim
Arduino -тай аюулгүй байдал: Atecc608a
Arduino -тай аюулгүй байдал: Atecc608a
Arduino -тай аюулгүй байдал: Atecc608a
Arduino -тай аюулгүй байдал: Atecc608a

Сэдэв

Бүгдээрээ сайн уу !

Энэ бол миний анхны зааварчилгааны нийтлэл тул та бүхэнд сонирхолтой байх болно гэж найдаж байна.

Энэ нийтлэлд би аюулгүй байдлын олон хэрэгслээр хангадаг "ATECC608A" нэртэй бичил чипийг хэрхэн ашиглах талаар тайлбарлах болно.

Энэхүү чипийг MicroChip зохион бүтээсэн бөгөөд энэ нь "CryptoAuthentication chip" -ийн хамгийн сүүлийн хувилбар юм. Энэ хувилбараас өмнө "ATSHA204A" ба "ATECC508A" байсан.

Яагаад би өмнөх хувилбарыг ашиглахгүй харин сүүлийн хувилбарыг ашиглахаар шийдсэн юм бэ?

Энэ хувилбар нь хамгийн дэвшилтэт чип бөгөөд хуучин хувилбарт байдаггүй функцуудтай (жишээ нь: AES модуль, IO хамгаалах модуль …).

Яагаад энэ төсөл вэ?

Би CyberSecurity -ийн домэйн дээр ажилладаг бөгөөд програмчлал, электроникийн дуртай бүх хүмүүсийн хувьд. Суралцах хугацаандаа би IoT аюулгүй байдлын чиглэлээр мэргэшсэн мэргэжилтэнтэй хийсэн уулзалтанд оролцож, Industrial нь IoT объект дээрээ Аюулгүй байдлыг ашигладаггүй болохыг харуулсан. Би ухаалаг гар утсаа Bluetooth ашиглан нээж болох цоожны түгжээг бидэнд үзүүлэв. Цоожны цаасан дээр "Энэ цоож цоожны цоожноос хамгийн найдвартай!" Гэсэн өгүүлбэр байна. Энэ өгүүлбэр нь түүнийг инээмсэглүүлж, "Энэ цоож хэзээ ч бүтээсэн хамгийн муу цоож юм!" Гэсэн өгүүлбэрийг өөрчилжээ.

Тэр бидэнд ухаалаг гар утсаараа илгээсэн тушаал бүр ижил байдаг бөгөөд энэ тушаалыг хуулж ухаалаг гар утсаараа илгээх нь маш энгийн гэдгийг тэрээр өөрийн компьютер болон Bluetooth -ийн шинжээчээр бидэнд харуулсан. Тэрээр "Аж үйлдвэрийн" гэсэн "аюулгүй байдал" нь гол асуудал биш гэдгийг бидэнд тайлбарласан. Тэрээр эдгээр объектод аюулгүй байдлын давхаргыг нэмж болох чипсийг (0.60 доллараас бага) бидэнд үзүүлэв.

Энэхүү үзүүлбэрийн дараа би IoT объектод хамгаалалтын давхарга нэмдэг Нээлттэй эхийн төслийг хайж олохыг оролдсон боловч би олсонгүй.

Тиймээс би хоёр IoT объектын хоорондох холболтын аюулгүй байдлын давхаргыг ашигладаг төсөл дээр ажиллахаар шийдсэн.

Миний санаа юу вэ?

Хоёр IoT объект хоорондын харилцааны явцад олон халдлага гарч болзошгүй: Зөөлөн хүн, мэдээллийн хуулбар гэх мэт.. Тиймээс миний санаа маш энгийн:

  1. Хоёр ба түүнээс дээш IoT объектын хооронд шифрлэгдсэн өгөгдлийг ашиглах.
  2. Бага өртөгтэй хангамж
  3. Arduino UNO -тэй ажиллах боломжтой

Одоо би энэ хийсвэр зургийг Arduino болон Atecc608a чип ашиглан хэрхэн хэрэгжүүлсэнээ тайлбарлах болно. Энэ нийтлэлд би Arduino UNO -ийг ATECC608A -тай хэрхэн ашиглах талаар тайлбарлах болно.

Дараагийн удаа би хоёр объектын харилцааны талаар нийтлэл бичих болно.

Хангамж

Энэ төслийн хувьд танд хэдэн зүйл хэрэгтэй болно:

  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 -д функц бүрийн тайлбарыг оруулсан болно. Хэрэв танд миний код эсвэл энэ төслийн талаар зарим асуулт байвал би хариулахад баяртай байх болно.

Миний Гитуб: Миний Гитуб

Алхам 2: Atecc608a -ийн тухай анхааруулга

Atecc608a -ийн тухай анхааруулга
Atecc608a -ийн тухай анхааруулга

Atecc608a чип нь "хялбар" чип биш юм.

Нэгдүгээрт, энэ чипний баримт бичиг нь NDA -ийн доор байгаа тул та үүнийг интернетээс бүрэн олж чадахгүй. Гэхдээ үүнд ямар ч асуудал байхгүй, өмнөх хувилбарын мэдээллийн хүснэгтийг ATECC508A иж бүрэн мэдээллийн мэдээллийн хуудсан дээрээс авах боломжтой.

Хоёрдугаарт, та энэ чипийг ашиглахдаа түүний тохиргоог түгжих шаардлагатай бөгөөд түгжигдсэн тохиолдолд чипийн тохиргоог өөрчлөх боломжгүй юм. Тиймээс Config Zone болон Data Zone -ийг түгжихдээ болгоомжтой байгаарай.

Гуравдугаарт, С хэл дээр бичсэн номын сан нь маш том бөгөөд бүрэн гүйцэд тул та өмнө нь ашиглах функцүүдийнхээ бичиг баримтыг унших ёстой.

Дөрөвдүгээрт, номын сан нь энэхүү чипт зориулж Arduino UNO -д тохирохгүй гэж бичсэн боловч Arduino UNO -той ажиллахад шаардлагатай функцуудыг нэмж оруулсан болно.

ATECC608A чип

Та энэ чиптэй I2C -ээр харилцах боломжтой. Энэ чипний хаягийг тохиргоонд өөрчилж болно.

Энэ чип нь өөр төрлийн өгөгдөл агуулсан 16 өөр үүрийг агуулдаг.

  1. ECC түлхүүр (хувийн эсвэл нийтийн)
  2. AES түлхүүр
  3. Бусад өгөгдөл (Ша хэш эсвэл зүгээр л үг гэх мэт)

Манай тохиолдолд бид AES түлхүүрийг нэг үүрэнд хадгалах болно.

Алхам 3: 1. Хэлхээний загвар

1. Хэлхээний загвар
1. Хэлхээний загвар
1. Хэлхээний загвар
1. Хэлхээний загвар

1. Хэлхээний дизайн

Энэ хэлхээний схем нь маш энгийн!

Зөвлөмж нь 2.0 В -оос 5.5 В -ийн хооронд байгаа тул та 3.3 В хүчийг ашиглах хэрэгтэй, гэхдээ би 3.3 В -ийг ашиглахыг илүүд үзсэн.

Энэ чипийн хувьд ихэвчлэн та чипний буланд цэг байрлуулдаг бөгөөд энэ цэг нь энэ самбарын зүү 1 юм. Би Atecc608a-ийн ПИН дугаартай Top View-ийг нэмсэн, учир нь энэ нь 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)

Зөвлөмж нь 2.0 В -оос 5.5 В -ийн хооронд байгаа тул та 3.3 В хүчийг ашиглах хэрэгтэй, гэхдээ би 3.3 В -ийг ашиглахыг илүүд үзсэн.

Би Atecc608a-ийн Top View-ийг нэмсэн, учир нь энэ нь 8 хар тугалгатай SOIC тул чип нь маш жижиг юм. Хэрэв та хүсвэл ханган нийлүүлэгчид чип гагнуураар самбар хийх нь танд илүү хялбар байх болно.

Анхааруулга: Миний хувьд би Arduino болон чипийн SDA (мөн SDL -ийн хувьд) хооронд резистор нэмэх ёстой. Би тус бүрт 4.7Kohm эсэргүүцэл нэмсэн.

Алхам 4: 2. Чипийн тохиргоо (Atecc608a)

Шифрлэх эсвэл шифрлэх функцийг ашиглахын өмнө та чипийг тохируулах хэрэгтэй. Энэ алхамд би энэ чипийг тохируулахын тулд хийх ёстой алхам бүрийг нарийвчлан тайлбарлах болно.

Анхааруулга: энэ алхам нь маш чухал бөгөөд хэрэв та бүсүүдийг эцэслэхээс өмнө түгжих юм бол өөрчлөх боломжгүй.

Өмнө тайлбарласны дагуу энэ чип нь хоёр бүстэй:

  1. Тохируулах бүс
  2. Өгөгдлийн бүс

Тохиргооны бүс нь 128 байтын хэмжээтэй боловч эхний 16 байтыг өөрчлөх боломжгүй.

Энэ чипийг тохируулахын тулд та эдгээр алхмуудыг дагаж мөрдөх ёстой. Алхам бүрийг дарааллаар нь хийх нь маш чухал бөгөөд эс тэгвээс таны тохиргоо ажиллахгүй болно, таны чип түгжигдсэн, ашиглах боломжгүй болно. Эдгээр алхамууд нь:

  1. Тохиргооны загвар үүсгэх
  2. Энэ загварыг чип дээр бичээрэй
  3. Тохиргооны бүсийг түгжих
  4. AES түлхүүрээ (128 бит) үүрэнд бичнэ үү
  5. Өгөгдлийн бүсийг түгжих

Мэдээлэл

Доороос би өөрийн тохируулгын алхам бүрийг кодоороо нарийвчлан тайлбарласан боловч санаа зоволтгүй, би Github дээрээ тохиргооны бүрэн жишээг нэмж оруулсан болно. Би функц бүр дээр тайлбар бичдэг бөгөөд алхам тутамд *.ino файл байдаг.

  • Миний Гитуб: Миний Гитуб
  • Тохируулгын жишээний зам: configuration_example.ino

Эхний алхам: тохиргооны загвар үүсгэх

Өмнө тайлбарласны дагуу тохиргооны бүс нь 128 битийн хэмжээтэй боловч эхний 16 битийг өөрчлөх боломжгүй юм. Энэ бүс нь хэд хэдэн хэсгээс бүрдэнэ, гэхдээ та энэ төслийн тохиргооны бүсийн зөвхөн 3 хэсгийг мэдэх хэрэгтэй.

  1. Bytes 16 -> Энэ бол чипний I2C хаяг юм
  2. Байт 20 -оос 51 хүртэл -> Та энэ чипний 16 үүрэнд зориулсан үүрний төрлийг эндээс өөрчилж болно
  3. Byte 96 to 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, // Slot Config Slot 15 0xAF, 0x8F, // Slot Config Slot 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF 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, // Key Config Slot 1 0x33, 0x00, // Key Config Slot 2 0x33, 0x00, // Key Config Slot 3 0x1C, 0x00, // Key Config Slot 4 0x1C, 0x00, // Түлхүүр тохируулах үүр 5 0x 1C, 0x00, // Key Config Slot 6 0x1C, 0x00, // Key Config Slot 7 0x3C, 0x00, // Key Config Slot 8 0x1A, 0x00, // Key Config Slot 9 0x3A, 0x00, // Key Config Slot 10 0x1A, 0x00, // Key Config Slot 11 0x3A, 0x00, // Key Config Slot 12 0x3A, 0x00, // Key Config Slot 13 0x3C, 0x00, // Key Config Slot 14 0x3C, 0x00, // Key Config Slot 15 0x1C, 0x00 // Түлхүүр тохируулах үүр 16

Энэ тохиргоог илүү сайн ойлгохын тулд би энэ кодонд хэдэн тайлбар оруулсан болно.

Таны хувьд зөвхөн гурван зүйлийг ойлгох хэрэгтэй.

  1. Bytes 16 -> Энэ бол чипний I2C хаяг юм
  2. Байт 20 -оос 51 хүртэл -> Та энэ чипний 16 үүрэнд зориулсан үүрний төрлийг эндээс өөрчилж болно
  3. Byte 96 to 127 -> Та энд үүр бүрийн хувьд ашиглагддаг түлхүүр эсвэл өгөгдлийн төрлийг тохируулж болно.

Би бүх зүйлийг тайлбарлахад төвөгтэй байдаг тул би тохиргооны төрөл, яагаад үүнийг ашиглахыг тайлбарлахгүй. Хэрэв танд илүү их мэдээлэл хэрэгтэй бол баримт бичиг рүү орно уу, "SlotConfig" хуудасны 16 -р хэсгийн 2.2.1, "KeyConfig" -ийн 19 -р хэсгийн 2.2.5 -ийг үзнэ үү.

Энэ жишээнд та 9 -р үүрийг ашиглан AES түлхүүрийг хадгалах болно.

Үүнийг хийхийн тулд бид оруулах хэрэгтэй (хэрэв танд хэрэгтэй бол дээрх жишээг хуулж болно, үүнд өөрчлөлт оруулсан болно):

  1. Байт 36 = 0x8F
  2. Байт 37 = 0x0F
  3. Байт 112 = 0x1A
  4. Байт 113 = 0x00

Би яагаад энэ тохиргоог хийсэн бэ: Энэ чипний үүр бүрийн хувьд та ямар төрлийн өгөгдөл хадгалахыг чипт хэлэх параметрүүдийг тохируулж болно. Танд олон параметрүүд байна:

  • Слотыг бичих эсвэл унших боломжтой (үйлдлийг арилгах эсвэл шифрлэх)
  • Хадгалагдсан өгөгдлийн төрөл (ECC түлхүүр, нийтийн түлхүүр, SHA хэш, AES түлхүүр …)
  • Слотыг түгжих боломжтой
  • Түлхүүр үүсгэхийг зөвшөөрдөг

36 ба 37 байтийг "0x0F8F" болгож тохируулснаар:

  • Өгөгдлийг Clear дээр бичиж болно
  • Энэ үүрний агуулга нууц бөгөөд унших боломжгүй
  • CheckMac Copy командын үүрийг ашиглах боломжгүй

112 ба 113 байтыг "0x001A" болгож тохируулснаар:

Слот нь дөрвөн ширхэг AES 128 битийн тэгш хэмт түлхүүр хадгалах боломжтой (KeyType = 0x6)

Хоёрдахь алхам: Энэ тохиргоог бичнэ үү

Энэ алхам нь маш чухал юм, учир нь бид чипийг өөрийн тохиргоогоор тохируулах бөгөөд хэрэв энэ тохиргоо сайн биш бол та энэ чипийг ашиглах болно.

Гэхдээ санаа зоволтгүй, хэрэв Тохиргоо түгжигдээгүй бол та тохиргоогоо өөрчилж болно.

Энд, энэ нь чип дээр тохиргоог бичихэд ашигладаг код юм:

/** / товч Чип дээр шинэ тохиргоо бичээрэй.

* / param [in] cfg Логик интерфэйсийн тохиргоо. Урьдчилан тодорхойлсон * зарим тохиргоонуудыг atca_cfgs.h * / param [in] config -аас олж болно uint8_t тохиргооны массив (урт 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) {// Тохиргооны массивыг чип рүү бичих // 16 байтын дүүргэлт (16 эхний байтыг бичих боломжгүй) 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] LOCK_ZONE_DATA эсвэл LOCK_ZONE_CONFIG * бүсээс олж болно / ATCA_SUCCESS -ийг амжилттай буцаана, эс бөгөөс алдааны код. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {ATCA_STATUS төлөв; bool lock = худал; хэрэв (бүс! = (uint8_t) LOCK_ZONE_CONFIG && бүс! = (uint8_t) LOCK_ZONE_DATA) буцах ATCA_BAD_PARAM; төлөв = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {буцах 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] түлхүүр түлхүүрийн оролтын дугаараас олж болно * / param [in] datakey түлхүүр массив uint8_t * / param [in] len Түлхүүр массивын хэмжээ * / ATCA_SUCCESS -ийг амжилтанд буцааж өгөх, өөр тохиолдолд алдааны код. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t түлхүүр, uint8_t *datakey, size_t len) {if (түлхүүр 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) түлхүүр, 0, 0, өгөгдөл, 32); if (status! = ATCA_SUCCESS) буцах төлөв; } буцах байдал; }

Энэ жишээнд би тус бүрдээ 16 байт бүхий хоёр AES түлхүүрийг ашиглах болно.

// AES KEY -ийн жишээ (len 32) uint8_t example_of_key [32] = "АААААААААААААААААААААААААААААААААААА"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Хэрэв энэ үйлдэл сайн байвал одоо та "өгөгдлийн бүсийг түгжих" сүүлийн алхамыг хийх ёстой.

Сүүлийн алхам: Өгөгдлийн бүсийг түгжих

Анхааруулга: Хэрэв та энэ бүсийг түгжиж, өгөгдлөө тохируулаагүй бол энэ алхамыг хийхдээ болгоомжтой байгаарай, чип ашиглах боломжгүй бөгөөд та энэ бүсийг өөрчилж чадахгүй байна

Энэ үйлдлийн хувьд бид энэ функцийг ашиглах болно:

/** / товч DATA_ZONE эсвэл CONFIG_ZONE түгжигдсэн эсэхийг шалгана уу

* / param [in] cfg Логик интерфэйсийн тохиргоо. Урьдчилан тодорхойлсон * зарим тохиргоог atca_cfgs.h * / param [in] LOCK_ZONE_DATA эсвэл LOCK_ZONE_CONFIG * бүсээс олж болно / ATCA_SUCCESS -ийг амжилттай буцаана, эс бөгөөс алдааны код. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {ATCA_STATUS төлөв; bool lock = худал; хэрэв (бүс! = (uint8_t) LOCK_ZONE_CONFIG && бүс! = (uint8_t) LOCK_ZONE_DATA) буцах ATCA_BAD_PARAM; төлөв = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {буцах 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 хэштэй) (дэлгэрэнгүй тайлбарыг Wikipedia -аас үзнэ үү)

Ашиглахад хялбар болгохын тулд би хоёр функцийг үүсгэсэн.

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Эдгээр хоёр функцийг миний Github дээр ашиглах боломжтой.

Тайлбар

Би AES CBC алгоритмыг ашиглахыг сонгосон, учир нь энэ нь үндсэн AES 128 битээс илүү аюулгүй юм. Энэхүү алгоритм нь өгөгдлийг шифрлэхийн тулд анхны векторыг ашигладаг.

Мэдээлэл

Доор би шифрлэх, шифрлэх аргын алхам бүрийг нарийвчлан тайлбарласан болно. Гэхдээ би эдгээр хоёр функцийг ашигладаг Arduino -д зориулж код бичсэн. Та энэ кодыг миний Github дээрээс харж болно.

  • Гитуб: Миний Гитуб
  • "Шифрлэх/тайлах" кодын жишээ: AES_crypto_example.ino

Эхний алхам: өгөгдлөө шифрлэх

Энэ хэсэгт би өгөгдлөө хэрхэн шифрлэхийг үзүүлэх болно.

Эхлээд танд энэ функц хэрэгтэй болно:

/** / товч AES CBC алгоритмыг ашиглан өгөгдлийг шифрлэх* / param [in] cfg Логик интерфэйсийн тохиргоо. Урьдчилан тодорхойлсон * зарим тохиргоог atca_cfgs.h * / param [in] өгөгдлөөс олж болно. Шифрлэх үгс (16 -д хуваагдах ёстой, хамгийн их урт нь 240) * / param [in] урт шифрлэх үгний урт (16 -д хуваах ёстой), хамгийн их урт 240) * / param [out] iv AES CBC -д ашиглагддаг анхны вектор (энэ векторыг буцаана уу) * / param [out] шифрийн текст энд Cypher text * / param [in] түлхүүрийг оруулна. түлхүүр * / амжилттай ATCA_SUCCESS -ийг буцаана уу, эс бөгөөс алдааны код. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *өгөгдөл, int len, uint8_t *iv, uint8_t *шифрийн текст, uint8_t түлхүүр) {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 (status! = 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, өгөгдөл, len); int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & шифрийн текст [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, 0x кодын алдаа")); Serial.println (төлөв, HEX); } буцах байдал; } буцах байдал; }

Энэ функцийг ашиглахад хялбар тул та хоёр зүйлийг тохируулах хэрэгтэй.

  1. 16 байтын хоосон IV (Анхны вектор)
  2. Шифрлэх өгөгдөл (хамгийн их хэмжээ 240 байт)

Энд "энэ функцийг хэрхэн ашиглах тухай" жишээ байна.

Би түлхүүрээ "9" үүрэнд бичсэн "AAAAAAAAAAAAAAA" гэсэн үгийг шифрлэхийг хүсч байна.

ATCA_STATUS төлөв = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () амжилтгүй болсон: Код -> 0x")); Serial.println (төлөв, HEX); } uint8_t энгийн текст [16] = "AAAAAAAAAAAAAAAA"; // Анхны текст uint8_t iv [IV_LENGTH_CBC]; // Анхны Вектор uint8_t cypherdata [sizeof (энгийн текст)]; // Мэдээллийн шифрлэгдсэн байдал = aes_cbc_encrypt (& cfg, энгийн текст, sizeof (энгийн текст), iv, cypherdata, 9);

Хэрэв үйлдэл сайн байвал танд "cypherdata" хувьсагч болон "IV" хувьсагчийн Initial Vector шифрлэгдсэн өгөгдөл байх болно.

Текстээ тайлахын тулд эдгээр хоёр хувьсагчийг хадгална уу!

Хоёрдахь алхам: өгөгдлийг шифрлэх

Өгөгдлийг шифрлэхийн тулд танд хоёр зүйл хэрэгтэй болно.

  1. Анхны вектор
  2. Cypher өгөгдөл (шифрлэгдсэн өгөгдөл)

Өгөгдлийг шифрлэхийн тулд танд дараах функц хэрэгтэй болно.

/** / товч AES CBC алгоритмыг ашиглан өгөгдлийг шифрлэх* / param [in] cfg Логик интерфэйсийн тохиргоо. Урьдчилан тодорхойлсон * зарим тохиргоог atca_cfgs.h * / param [in] шифр текстээс олж болно. Шифрийг тайлах үгс (16 -д хуваагдах ёстой, хамгийн их урт нь 240 байх ёстой), хамгийн их урт нь 240) * / param [in] iv AES CBC -д ашиглах анхны вектор * / param [out] энгийн текстийг энд буцааж шифрлэсэн текстийг буцааж өгнө үгүй бол алдааны код. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *шифрийн текст, int len, uint8_t *iv, uint8_t *энгийн текст, uint8_t түлхүүр) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: 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 (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, 0x кодын алдаа")); Serial.println (төлөв, HEX); буцах; } int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & textte [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, 0x кодын алдаа")); Serial.println (төлөв, HEX); } буцах байдал; } буцах байдал; }

Би өмнөх өгөгдлөө тайлахыг хүсч байна (доороос үзнэ үү, эхний алхам). Үүний тулд би үүнийг хийх болно:

uint8_t энгийн текст [16] = "AAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t шифрийн мэдээлэл [sizeof (энгийн текст)]; uint8_t шифрийг тайлах [sizeof (энгийн текст)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Шифрийг тайлсан текст нь:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Erca Serial.print кодыг авахын тулд atca_status.h файлыг үзнэ үү (F ("Шифрийг тайлах боломжгүй | Кодын алдаа 0x")); Serial.println (төлөв, HEX); буцах; }

Хэрэв үйлдэл сайн байвал та "decryptdata" хувьсагчийн шифрлэгдсэн өгөгдлийг авах болно.

Одоо та Atecc608a чип ашиглан шифрлэлт, шифрлэлтийг хэрхэн ашиглахаа мэддэг боллоо

Алхам 6: 5. Та яагаад энэ чипийг ашиглах хэрэгтэй байна вэ?

Шифрлэгдсэн өгөгдөл нь маш ашигтай байдаг, учир нь та мэдээллээ нууж, утасгүй сүлжээгээр илгээх эсвэл зүгээр л хадгалах боломжтой.

Ашиглалтын жишээ энд байна:

  1. Гадны EEPROM -д хадгалагдсан өгөгдөл: Та гадаад EEPROM -ийн өгөгдлийг хамгаалах боломжтой бөгөөд хэрэв хэн нэгэн энэ EEPROM хэвээр байгаа бол түүнд код тайлах түлхүүр болон IV хэрэгтэй болно.
  2. Утасгүй өгөгдөл илгээх: Та энэ шифрлэгдсэн өгөгдлийг Wireless (nrf24L01, RFM95W …) ашиглан илгээх боломжтой бөгөөд хэрэв хэн нэгэн таны өгөгдлийг тасалдуулбал энэ өгөгдөл аюулгүй байх болно.
  3. Хадгалсан нууц үг

Энэхүү чип ашиглан та олон зүйлийг хийж чадна. Үүнийг олон төсөлд ашиглах боломжтой. Хэрэв танд цаг байвал энэ чипийг ямар төсөлд ашиглахаа надад хэлээч?

Хамгийн сүүлчийн зөвлөгөө бол хэрэв та утасгүй төсөл бүтээх эсвэл түүхий өгөгдөл хадгалах юм бол болгоомжтой байгаарай, аюулгүй байдал маш чухал бөгөөд хэрэв та "noob" таны өгөгдлийг таслан зогсоох, хулгайлах нь энгийн зүйл болохыг мэддэг бол. Одоо интернеттэй болсноор хүн бүр таныг "хакердах" зорилгоор компьютер дээрээ ажиллуулах скриптүүдтэй болно.

Алхам 7: Дүгнэлт

Энэ нийтлэл танд хэрэгтэй болно гэж найдаж байна. Би текст дээрээ алдаа гаргасан бол уучлаарай, гэхдээ англи хэл бол миний үндсэн хэл биш, би бичихээсээ илүү сайн ярьдаг.

Бүгдийг уншсанд баярлалаа.

Таашаал аваарай.

Зөвлөмж болгож буй: