Мазмуну:

Arduino менен коопсуздук: Atecc608a: 7 кадам
Arduino менен коопсуздук: Atecc608a: 7 кадам

Video: Arduino менен коопсуздук: Atecc608a: 7 кадам

Video: Arduino менен коопсуздук: Atecc608a: 7 кадам
Video: Робототехника Arduino комплектиси 2024, Июль
Anonim
Arduino менен коопсуздук: Atecc608a
Arduino менен коопсуздук: Atecc608a
Arduino менен коопсуздук: Atecc608a
Arduino менен коопсуздук: Atecc608a

Тема

Баарыңарга салам !

Бул менин биринчи нускамалуу макалам, ошондуктан баарыңыздарга кызыктуу болот деп ишенем.

Бул макалада мен сизге бир нече коопсуздук куралдарын камсыз кылган "ATECC608A" деп аталган микро чипти кантип колдонууну түшүндүрөм.

Бул чип MicroChip тарабынан иштелип чыккан жана ал "CryptoAuthentication чипинин" акыркы версиясы. Бул версияга чейин "ATSHA204A" жана "ATECC508A" болгон.

Эмне үчүн мен мурунку версиясын эмес, акыркы версиясын колдонууну чечтим?

Бул версия эң алдыңкы чип болуп саналат жана эски версияда жок функцияларды алган (Мисалы: AES модулу, IO коргоо модулу …).

Эмне үчүн бул долбоор?

Мен CyberSecurity доменинде иштейм жана программалоону жана электрониканы баардыгы жакшы көрчү. Окуу учурунда мен IoT Security боюнча адис менен конференция алам, ал бизге өнөр жай 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га кодумду ар бир функция үчүн комментарийлер менен кошуп койдум. Эгерде менин кодума же бул долбоорго байланыштуу суроолор болсо, мен жооп берүүгө кубанычтамын.

Менин Github: Менин Github

2 -кадам: Atecc608a жөнүндө эскертүү

Atecc608a жөнүндө эскертүү
Atecc608a жөнүндө эскертүү

Atecc608a чипи "оңой" чип эмес.

Биринчиден, бул чиптин документтери NDAнын астында, андыктан аны Интернеттен толук таба албайсыз. Бирок бул үчүн эч кандай көйгөй жок, мурунку версиянын маалымат таблицасы ATECC508A Интернет маалымат тактасында жеткиликтүү.

Экинчиден, сиз бул чипти колдонгонуңузда анын конфигурациясын кулпулашыңыз керек жана ал чиптин конфигурациясын кулпуланган учурда өзгөртүү мүмкүн эмес. Ошентип, Config Zone менен Data Zone'ду бекитип жатканда этият болуңуз.

Үчүнчүдөн, С тилинде жазылган китепкана абдан чоң жана толук, андыктан сиз мурда колдоно турган функциялардын документтерин окууңуз керек.

Төртүнчүдөн, китепкана бул чипке Arduino UNO үчүн иштебей тургандыгын жазган, бирок ал Arduino UNO менен иштөө үчүн анын функцияларын кошкон.

ATECC608A чипи

Сиз бул чип менен I2C аркылуу баарлаша аласыз. Бул чиптин дареги конфигурацияда өзгөртүлүшү мүмкүн.

Бул чипте ар кандай маалыматтарды камтышы мүмкүн болгон 16 башка уячалар бар:

  1. ECC ачкычы (жеке же коомдук)
  2. AES ачкычы
  3. Башка маалыматтар (Sha хэш же жөн эле сөздөр сыяктуу)

Биздин учурда, биз AES ачкычын бир уячага сактайбыз.

3 -кадам: 1. Райондун дизайны

1. Райондун дизайны
1. Райондун дизайны
1. Райондун дизайны
1. Райондун дизайны

1. Райондун дизайны

Бул схеманын схемасы абдан жөнөкөй!

Сиз 3.3V кубатын колдонушуңуз керек, анткени сунуш 2.0V менен 5.5V ортосунда, бирок мен 3.3V колдонууну туура көрдүм.

Бул чип үчүн, адатта, чиптин бир бурчунда чекит бар, бул чекит бул тактанын 1 -пини. Мен PIN номери менен 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 болгондуктан, чип абдан кичинекей. Эгер сиз кааласаңыз, анда жеткирүүчүлөр чиптин ширеси менен бир нече тактай курушат, бул сиз үчүн оңой болмок.

Эскертүү: Менин учурда, мен Arduino менен чиптин SDAсынын ортосунда резистор кошушум керек (ошондой эле SDL үчүн). Мен ар бирине 4.7Kohm резистор коштум.

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. Байттар 20дан 51ге чейин -> Бул жерде бул чиптин 16 уячасы үчүн Slotтун түрүн өзгөртө аласыз
  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, // 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, 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, // Key Config Slot 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 // Key Config Slot 16

Көрүнүп тургандай, мен бул конфигурацияны түшүнүү үчүн бул кодго бир нече комментарий жаздым.

Сиздин учурда үч нерсени түшүнүү керек:

  1. Bytes 16 -> Бул чиптин I2C дареги
  2. Байттар 20дан 51ге чейин -> Бул жерде бул чиптин 16 уячасы үчүн Slotтун түрүн өзгөртө аласыз
  3. Byte 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 Hash, AES ачкычы …)
  • Слот кулпуланып калышы мүмкүн
  • Ачкычты түзүүгө уруксат берилет

36 жана 37 байт "0x0F8F" деп коюлганда:

  • Берилиштерди Clearке жазууга болот
  • Бул уячанын мазмуну жашыруун жана окулбайт
  • Slot CheckMac Copy буйругу үчүн колдонулушу мүмкүн эмес

112 жана 113 байттары менен "0x001A" коюлган:

Slot төрт 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 = 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 байт маалымат. Ошентип, мен 32 байт маалыматка ээ болуу үчүн бул уячанын ар бирине 16 байттан турган ачкычка жазууну чечтим.

Эми мен сизге колдонулган кодду көрсөтөм:

/** / кыска AES ачкычын берилген уячага жазыңыз. * / param [in] cfg Логикалык интерфейстин конфигурациясы. Кээ бир алдын ала аныкталган * конфигурацияларды atca_cfgs.h * / param [in] key key slot number * / param [in] datakey key array uint8_t * / param [in] len ачкыч массивинин өлчөмү * / ATCA_SUCCESS ийгиликке кайтууда, болбосо ката коду. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (key 16) ATCA_BAD_PARAM кайтаруу; if (len! = 32) return ATCA_BAD_PARAM; ATCA_STATUS абалы = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) ачкыч, 0, 0, datakey, 32); if (status! = ATCA_SUCCESS) кайтаруу абалы; } кайтаруу абалы; }

Бул мисал үчүн, мен ар бири 16 байттан турган эки AES ачкычын колдоном:

// AES KEY үлгүсү (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 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 = false; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) return 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 биттерине караганда коопсуз. Бул алгоритм маалыматыңызды шифрлөө үчүн баштапкы векторду колдонот.

Маалымат

Төмөндө мен шифрлөө жана чечмелөө ыкмасынын ар бир кадамын деталдаштырам. Бирок мен Arduino үчүн ошол эки функцияны тең колдонгон код жаздым. Бул кодду менин Githubдан көрө аласыз:

  • Github: Менин Github
  • "Encrypt/Decrypt" кодунун мисалы: 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] key Слоттун номери key * / ийгиликке 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, data, len); int max = len / 16; for (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. Бош IV (Баштапкы Вектор) 16 байт
  2. Шифрлөө үчүн маалыматтар (максималдуу өлчөмү 240 байт)

Бул жерде "бул функцияны кантип колдонуу керек" мисалы.

Мен "AAAAAAAAAAAAAAAA" деген сөздү шифрлегим келет, ачкычым "9" уячасына жазылган:

ATCA_STATUS абалы = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () ишке ашкан жок: Code -> 0x")); Serial.println (абалы, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAAA"; // Түпнуска текст uint8_t iv [IV_LENGTH_CBC]; // Баштапкы Вектор uint8_t cypherdata [sizeof (plaintext)]; // Маалыматтардын шифрленген абалы = 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] ачык текст бул жерге шифрленген текстти кайтарат * / param [in] key Ачкычтын уячасынын номери * / return ATCA_SUCCESS ийгиликке, болбосо ката коду. */ 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, Code Error 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], & opentext [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] = "АААААААААААААААА"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (ачык текст)]; uint8_t decryptdata [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. Эмне үчүн бул чипти колдонуу керек

Шифрленген маалыматтар абдан пайдалуу, анткени сиз маалыматты жашырып, Wireless аркылуу жөнөтүп же жөн эле сактай аласыз.

Бул жерде колдонуунун бир мисалы:

  1. Сырткы EEPROMга сакталган маалыматтар: Сиз тышкы EEPROMдун маалыматын коргой аласыз жана эгер кимдир бирөө бул EEPROM болсо, ага шифрди чечүү үчүн ачкыч жана IV керек болот
  2. Зымсыз маалыматтарды жөнөтүү: Сиз бул шифрленген маалыматты Wireless аркылуу жөнөтө аласыз (nrf24L01, RFM95W…) жана кимдир бирөө сиздин маалыматыңызды кармап калса, бул маалыматтар коопсуз болот
  3. Сакталган сырсөз

Бул чип менен бир нече нерсени жасай аласыз. Бул бир нече долбоордо колдонулушу мүмкүн. Эгер убактыңыз болсо, бул чипти кайсы долбоордо колдонооруңузду айтсаңыз?

Акыркы кеңеш, эгер сиз кандайдыр бир зымсыз долбоор түзсөңүз же кээ бир чийки маалыматты сактасаңыз, сак болуңуз, коопсуздук абдан маанилүү жана эгер сиз "noob" үчүн сиздин маалыматыңызды кармоо же уурдоо канчалык жөнөкөй экенин билсеңиз. Азыр Интернет менен, ар бир адам сизди "бузуу" үчүн компьютеринде ишке киргизүү үчүн сценарийлерге ээ боло алат!

7 -кадам: Жыйынтык

Бул макала сиз үчүн пайдалуу болот деп ишенем. Кечиресиз, эгер мен текстте ката кетирсем, бирок англис тили менин негизги тилим эмес жана мен жазгандан жакшыраак сүйлөйм.

Баарын окуу үчүн рахмат.

Ырахаттан.

Сунушталууда: