Kazalo:

Varnost z Arduinom: Atecc608a: 7 korakov
Varnost z Arduinom: Atecc608a: 7 korakov

Video: Varnost z Arduinom: Atecc608a: 7 korakov

Video: Varnost z Arduinom: Atecc608a: 7 korakov
Video: SKR 1.3 - TMC2208 UART v3.0 2024, Julij
Anonim
Varnost z Arduinom: Atecc608a
Varnost z Arduinom: Atecc608a
Varnost z Arduinom: Atecc608a
Varnost z Arduinom: Atecc608a

Tema

Pozdravljeni vsi skupaj !

To je moj prvi članek z navodili, zato upam, da bo zanimiv za vse vas.

V tem članku vam bom razložil, kako uporabljati mikročip z imenom "ATECC608A", ki ponuja več varnostnih orodij.

Ta čip je oblikoval MicroChip in je zadnja različica "čipa CryptoAuthentication". Pred to različico sta obstajala "ATSHA204A" in "ATECC508A".

Zakaj sem se odločil za uporabo zadnje in ne prejšnje različice?

Ta različica je najnaprednejši čip in ima funkcije, ki jih stara različica nima (na primer: modul AES, zaščitni modul IO …).

Zakaj ta projekt?

Delam na področju CyberSecurity in kot vsi sem imel rad programiranje in elektroniko. Med študijem imam konferenco s strokovnjakom za IoT Security, ki nam je pokazal, da Industrial ne uporablja Security v svojem objektu IoT. Pokazal sem nam ključavnico, ki jo lahko s pametnim telefonom odprete prek Bluetootha. Na ključavnici je bil stavek napisan: "Ta ključavnica je najbolj varna kot ključavnica!". Ta stavek ga je nasmehnil in spremenil stavek "Ta ključavnica je najslabša ključavnica, ki so jo kdajkoli zgradili!".

S svojim osebnim računalnikom in sniferjem Bluetooth nam je pokazal, da je vsak ukaz, ki ga pošlje pametni telefon, vedno enak in da je zelo preprosto kopirati ta ukaz in ga poslati s pametnim telefonom. Pojasnil nam je, da "varnost" za "industrijsko" ni glavni problem. Pokazal nam je žetone (manj kot 0,60 $), ki bi lahko tem predmetom dodali plast varnosti.

Po tej predstavitvi sem poskušal najti kakšen odprtokodni projekt, ki bi predmetu IoT dodal varnostno plast, vendar ga nikoli nisem našel.

Zato sem se odločil, da bom delal na projektu, ki uporablja varnostno plast za komunikacijo med dvema objektoma IoT.

Kakšna je moja ideja?

Med komunikacijo med dvema objektoma IoT lahko obstaja več napadov: Blagi človek, Kopija informacij in drugo.. Tako da je moja ideja zelo preprosta:

  1. Uporaba šifriranih podatkov med dvema ali več objekti IoT.
  2. Poceni zaloge
  3. Lahko sodeluje z Arduino UNO

Zdaj vam bom razložil, kako sem to abstraktno sliko implementiral z čipom Arduino in Atecc608a. V tem članku vam bom razložil, kako uporabljati Arduino UNO z ATECC608A.

Naslednjič bom napisal članek o komunikaciji dveh predmetov.

Zaloge

Za ta projekt potrebujete nekaj stvari:

  1. Arduino UNO ali MEGA (čip mora biti Atmega 328 ali ATMEGA 2560)
  2. Atecc608A čip (stane manj kot 0,80 $, enostaven za iskanje na spletnem mestu vašega dobavitelja)
  3. 8-polni adapter SOIC
  4. Nekaj žic in uporov

Podatkovni list prejšnje različice tega čipa (Atecc508a) je na voljo tukaj -> Tehnični list Atecc508a

Korak: korak za korakom

Korak za korakom
Korak za korakom

V tem članku vam bom pokazal, kako spremeniti konfiguracijo tega čipa in kako šifrirati podatke z algoritmom AES CBC.

Upoštevali bomo te korake:

  1. Zasnova vezja
  2. Konfiguracija tega čipa
  3. Uporaba modula AES CBC
  4. Zakaj morate uporabiti ta čip

Za vsak korak vam bom podrobno opisal vse. Prav tako sem v svoj Github dodal svojo kodo s komentarji za vsako funkcijo. Če imate vprašanja o moji kodi ali tem projektu, vam bom z veseljem odgovoril.

Moj Github: Moj Github

2. korak: Opozorilo glede Atecc608a

Opozorilo glede Atecc608a
Opozorilo glede Atecc608a

Čip Atecc608a ni "lahek" čip.

Prvič, dokumentacija tega čipa je pod NDA, zato je na internetu ne boste našli v celoti. Toda pri tem ni težav, podatkovni list prejšnje različice je na voljo na spletnem listu z informacijami Complete ATECC508A.

Drugič, ko uporabljate ta čip, morate zakleniti njegovo konfiguracijo in konfiguracije čipa ni mogoče spremeniti, če je zaklenjen. Zato bodite previdni, ko boste zaklenili območje konfiguracije in podatkovno območje.

Tretjič, knjižnica, napisana v jeziku C, je zelo velika in popolna, zato morate prebrati dokumentacijo o funkcijah, ki jih boste uporabljali prej.

Četrtič, knjižnica je zapisala, da ta čip ne deluje za Arduino UNO, vendar je dodala funkcionalnosti, ki jih potrebujejo za delo z Arduino UNO.

Čip ATECC608A

S tem čipom lahko komunicirate prek I2C. Naslov tega čipa je mogoče spremeniti v konfiguraciji.

Ta čip vsebuje 16 različnih rež, ki lahko vsebujejo različne vrste podatkov:

  1. ECC ključ (zasebni ali javni)
  2. AES ključ
  3. Drugi podatki (na primer Sha hash ali samo besede)

V našem primeru bomo ključ AES shranili v eno režo.

3. korak: 1. Projektiranje vezja

1. Oblikovanje vezja
1. Oblikovanje vezja
1. Oblikovanje vezja
1. Oblikovanje vezja

1. Zasnova vezja

Shema tega vezja je zelo preprosta!

Morate uporabiti napajanje 3.3V, ker je priporočilo med 2.0V in 5.5V, vendar sem raje uporabil 3.3V.

Za ta čip je običajno pika na vogalu čipa, ta pika je Pin 1 te plošče. Dodal sem pogled od zgoraj na Atecc608a s številko PIN, ker je 8-slovni SOIC, zato je čip zelo majhen.

  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)

Morate uporabiti napajanje 3.3V, ker je priporočilo med 2.0V in 5.5V, vendar sem raje uporabil 3.3V.

Dodal sem pogled od zgoraj na Atecc608a, ker je 8-slovni SOIC, zato je čip zelo majhen. Če želite, zato dobavitelji izdelajo ploščo s spajkalnikom čipov, bi vam lahko bilo lažje.

Opozorilo: V mojem primeru moram dodati upor med SDA Arduina in čipom (tudi za SDL). Za vsakega sem dodal 4,7Kohm upor.

4. korak: 2. Konfiguracija čipa (Atecc608a)

Pred uporabo funkcije šifriranja ali dešifriranja morate konfigurirati čip. V tem koraku bom podrobno opisal vse korake, ki jih morate narediti za konfiguracijo tega čipa.

Opozorilo: ta korak je zelo pomemben in če območja zaklenete pred koncem, jih ne morete spreminjati.

Kot je bilo že pojasnjeno, ima ta čip dve coni:

  1. Konfiguriraj cono
  2. Območje podatkov

Konfiguracijsko območje je bilo velikosti 128 bajtov, vendar prvih 16 bajtov ni mogoče spremeniti.

Če želite konfigurirati ta čip, sledite tem korakom. Zelo pomembno je, da sledite vsakemu koraku, sicer vaša konfiguracija ne bo delovala, vaš čip pa bo zaklenjen in neuporaben. Ti koraki so:

  1. Ustvarite konfiguracijsko predlogo
  2. To predlogo napišite v čip
  3. Zaklenite območje konfiguracije
  4. V režo zapišite svoj ključ AES (128 bitov)
  5. Zaklenite podatkovno območje

Informacije

Spodaj podrobno opisujem vsak korak conifguration s svojo kodo, vendar brez skrbi, v svoj Github sem dodal popoln primer konfiguracije. Komentiram vsako funkcijo, pri vsakem koraku pa je za vas na voljo datoteka *.ino.

  • Moj Github: Moj Github
  • Pot primerne konfiguracije: configuration_example.ino

Prvi korak: Ustvarite konfiguracijsko predlogo

Kot je bilo že pojasnjeno, konfiguracijsko območje dobi velikost 128 bitov, vendar prvih 16 bitov ni mogoče spremeniti. To območje je sestavljeno iz več delov, vendar morate za ta projekt poznati le 3 dele tega konfiguracijskega območja:

  1. Bajti 16 -> To je I2C naslov čipa
  2. Bajti od 20 do 51 -> Tu lahko spremenite vrsto reže za 16 rež tega čipa
  3. Bajti 96 do 127 -> Tu lahko nastavite vrsto ključa ali podatke, ki se uporabljajo v vsaki reži.

(Če potrebujete dodatno pojasnitev vsega tega območja, preberite dokumentacijo (stran 13, razdelek 2.2))

Tukaj podrobno vnesem vsakega bajta/dele 112 bajtov konfiguracije čipa. To je primer, vsak kupljen čip ima lahko drugačno konfiguracijo:

0xC0, // naslov I2C

0x00, 0x00, 0x00, 0x83, 0x20, // Reža za konfiguracijo reže 1 0x85, 0x20, // Reža za konfiguracijo reže 2 0x8F, 0x20, // Reža za konfiguracijo reže 3 0xC4, 0x8F, // Reža za konfiguracijo reže 4 0x8F, 0x8F, // Reža za konfiguracijo reže 5 0x8F, 0x8F, // Reža za konfiguracijo reže 6 0x9F, 0x8F, // Reža za konfiguracijo reže 7 0x0F, 0x0F, // Reža za konfiguracijo reže 8 0x8F, 0x0F, // Reža za konfiguracijo reže 9 0x8F, 0x0F, // Reža za konfiguracijo reže 10 0x8F, 0x0F, // Reža za konfiguracijo reže 11 0x8F, 0x0F, // Reža za konfiguracijo reže 12 0x8F, 0x0F, // Reža za konfiguracijo reže 13 0x00, 0x00, // Reža za konfiguracijo reže 14 0x00, 0x00, // Reža za konfiguracijo reže 15 0xAF, 0x8F, // Reža za konfiguracijo reže 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, 0xFF, 0xFF, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Reža za konfiguracijo ključa 1 0x33, 0x00, // Reža za konfiguracijo ključa 2 0x33, 0x00, // Reža za konfiguracijo ključa 3 0x1C, 0x00, // Reža za konfiguracijo ključa 4 0x1C, 0x00, // Reža za konfiguracijo ključa 5 0x 1C, 0x00, // Reža za konfiguracijo ključa 6 0x1C, 0x00, // Reža za konfiguracijo ključa 7 0x3C, 0x00, // Reža za konfiguracijo ključa 8 0x1A, 0x00, // Reža za konfiguracijo ključa 9 0x3A, 0x00, // Reža za konfiguracijo ključa 10 0x1A, 0x00, // Reža za konfiguracijo ključev 11 0x3A, 0x00, // Reža za konfiguracijo ključev 12 0x3A, 0x00, // Reža za konfiguracijo ključev 13 0x3C, 0x00, // Reža za konfiguracijo ključev 14 0x3C, 0x00, // Reža za konfiguracijo ključev 15 0x1C, 0x00 // Reža za konfiguracijo ključa 16

Kot vidim, sem v to kodo vnesel nekaj komentarjev, da bi bolje razumeli to konfiguracijo.

V vašem primeru morate razumeti le tri stvari:

  1. Bajti 16 -> To je I2C naslov čipa
  2. Bajti od 20 do 51 -> Tu lahko spremenite vrsto reže za 16 rež tega čipa
  3. Bajt 96 do 127 -> Tu lahko nastavite vrsto ključa ali podatke, ki se uporabljajo v vsaki reži.

Ne bom razlagal vrste konfiguracije in zakaj sem uporabil to in ne druge, ker je zapleteno razložiti vse. Če potrebujete več informacij, pojdite na dokumentacijo, stran 16, razdelek 2.2.1 za "SlotConfig" in stran 19, razdelek 2.2.5 za "KeyConfig"

V tem primeru boste režo 9 uporabili za shranjevanje ključa AES.

Za to moramo vnesti (če potrebujete, lahko kopirate zgornji primer, v njem je bila izvedena sprememba):

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

Zakaj sem nastavil to konfiguracijo: Za vsako režo tega čipa lahko nastavite parametre, ki bodo čipu povedali, kakšne vrste podatkov bodo shranjeni. Imate več parametrov:

  • Režo lahko pišete ali berete (počistite ali šifrirajte dejanje)
  • Vrsta shranjenih podatkov (ključ ECC, javni ključ, razpršitev SHA, ključ AES …)
  • Režo je mogoče zakleniti
  • Generiranje ključa je dovoljeno

Ko sta bajta 36 in 37 nastavljena na "0x0F8F":

  • Podatke je mogoče zapisati v Clear
  • Vsebina te reže je tajna in je ni mogoče brati
  • Reže ni mogoče uporabiti za ukaz CheckMac Copy

Ko sta bajta 112 in 113 nastavljena na "0x001A":

Reža lahko shrani do štiri 128-bitne simetrične ključe AES (KeyType = 0x6)

Drugi korak: Zapišite to konfiguracijo

Ta korak je zelo pomemben, ker bomo čip nastavili z našo konfiguracijo in če ta konfiguracija ni dobra, boste uporabili ta čip.

Brez skrbi, dokler konfiguracija ni zaklenjena, lahko svojo konfiguracijo spremenite.

Tukaj je to koda, uporabljena za zapis konfiguracije v čip:

/** / brief Napišite novo konfiguracijo v čip.

* / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [in] config Array uint8_t konfiguracije (dolžina 112) * / param [in] len Velikost konfiguracijske matrike * / vrne ATCA_SUCCESS ob uspehu, sicer koda napake. */ ATCA_STATUS konfiguracija za pisanje (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) vrne ATCA_BAD_PARAM; Stanje ATCA_STATUS; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Konfiguracijski niz napišemo v čip // Oblazinjenje 16 bajtov (16 prvih bajtov ni mogoče zapisati) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); status vrnitve; } status vrnitve; }

Ta funkcija bo zapisala vašo konfiguracijo v čip.

Tretji korak: zaklenite konfiguracijsko območje

Opozorilo: pri tem koraku bodite previdni: če zaklenete to območje in vaša konfiguracija ni dobra, je čip neuporaben in tega območja ne morete spremeniti

Za to dejanje bomo uporabili to funkcijo:

/** / brief Preverite, ali je DATA_ZONE ali CONFIG_ZONE zaklenjen

* / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [in] coni LOCK_ZONE_DATA ali LOCK_ZONE_CONFIG * / ob uspehu vrnejo ATCA_SUCCESS, sicer kodo napake. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t cona) {ATCA_STATUS status; bool lock = false; če (cona! = (uint8_t) LOCK_ZONE_CONFIG && cona! = (uint8_t) LOCK_ZONE_DATA) vrne ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (cona, & lock))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } vrnitev ATCA_SUCCESS; } return ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Četrti korak: V režo napišite ključ AES

V tem delu boste v režo, ki ste jo določili v konfiguraciji čipa, nastavili osebni ključ AES.

V tem primeru bom uporabil režo številko 9 čipa.

Morate vedeti: Posebnost tega čipa je, da lahko v režo zapišete podatke le za 4 ali 32 bajtov. Za AES potrebujemo 128 -bitni ključ, torej 16 bajtov podatkov. Zato sem se odločil, da bom zapisal na ključ po 16 bajtov v tej reži, da bom imel 32 bajtnih podatkov.

Zdaj vam bom pokazal uporabljeno kodo:

/** / brief Napišite ključ AES v določeno režo. * / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [in] številki reže ključa ključa * / param [in] matriki ključev podatkovnih ključev uint8_t * / param [in] len Velikost matrike ključev * / vrnite ATCA_SUCCESS pri uspehu, sicer koda napake. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (ključ 16) vrne ATCA_BAD_PARAM; if (len! = 32) vrne ATCA_BAD_PARAM; ATCA_STATUS status = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) ključ, 0, 0, podatkovni ključ, 32); če (status! = ATCA_SUCCESS) vrne status; } status vrnitve; }

V tem primeru bom uporabil dva ključa AES po 16 bajtov:

// Primer ključa AES (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Če je to dejanje dobro, morate zdaj opraviti zadnji korak "zaklepanje podatkovnega območja"

Zadnji korak: zaklenite podatkovno območje

Opozorilo: pri tem koraku bodite previdni: če zaklenete to območje in vaši podatki niso nastavljeni, je čip neuporaben in tega območja ne morete spremeniti

Za to dejanje bomo uporabili to funkcijo:

/** / brief Preverite, ali je DATA_ZONE ali CONFIG_ZONE zaklenjen

* / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [in] coni LOCK_ZONE_DATA ali LOCK_ZONE_CONFIG * / ob uspehu vrnejo ATCA_SUCCESS, sicer kodo napake. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t cona) {ATCA_STATUS status; bool lock = false; če (cona! = (uint8_t) LOCK_ZONE_CONFIG && cona! = (uint8_t) LOCK_ZONE_DATA) vrne ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (cona & zaklepanje))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } vrnitev ATCA_SUCCESS; } return ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Če je to dejanje dobro, je vaš čip pripravljen za uporabo

5. korak: 3. Uporaba modula AES CBC

3. Uporaba modula AES CBC
3. Uporaba modula AES CBC

Pojasnil bom, kako šifrirati in dešifrirati podatke z algoritmom AES CBC in čipom Atecc608a.

Ne pozabite: pred uporabo te funkcije morate nastaviti čip. V ta namen sledite 2. koraku tega članka

Ta čip ima več vrst modulov AES (AES 128 bitov), možni so le 128 bitov AES:

  1. AES normalno
  2. AES CBC
  3. AES GCM (z razpršitvijo GFM) (za več pojasnil glej wikipedia)

Za lažjo uporabo sem ustvaril dve funkciji:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Ti dve funkciji sta na voljo v mojem Githubu.

Pojasnilo

Za uporabo algoritma AES CBC sem se odločil, ker je varnejši od osnovnih 128 bitov AES. Ta algoritem uporablja začetni vektor za šifriranje vaših podatkov.

Informacije

Spodaj opisujem vsak korak metode šifriranja in dešifriranja. Napisal sem kodo za Arduino, ki uporablja obe funkciji. To kodo lahko vidite v mojem Githubu:

  • Github: Moj Github
  • Primer kode "Šifriraj/dešifriraj": AES_crypto_example.ino

Prvi korak: Šifrirajte svoje podatke

V tem delu vam bom pokazal, kako šifrirate svoje podatke.

Najprej boste potrebovali to funkcijo:

/** / brief Šifrirajte podatke z algoritmom AES CBC* / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [in] podatkov Besede za enciptiranje (deljeno s 16, največja dolžina 240) * / param [in] len dolžina Besede za enciptiranje (deljena s 16, največja dolžina 240) * / param [out] iv Začetni vektor, uporabljen v AES CBC (vrni vektor v tej var) * / param [out] šifriran tekst vrne sem šifrirano besedilo * / param [in] ključ Številka reže key * / return ATCA_SUCCESS o uspehu, sicer koda napake. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *podatki, int len, uint8_t *iv, uint8_t *šifrirano besedilo, uint8_t ključ) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("NAPAKA: ATCA_BAD_PARAM")); vrnitev ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS status = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, ključ, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("NAPAKA Šifriranje: atcab_aes_cbc_init, Napaka kode 0x")); Serial.println (status, HEX); vrnitev; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, podatki, len); int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & šifriran tekst [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("NAPAKA Šifriranje: atcab_aes_cbc_encrypt_block, Napaka kode 0x")); Serial.println (status, HEX); } status vrnitve; } stanje vrnitve; }

Ta funkcija je enostavna za uporabo, nastaviti morate dve stvari:

  1. Prazen IV (začetni vektor) s 16 bajti
  2. Podatki za šifriranje (največja velikost 240 bajtov)

Tukaj je primer "kako uporabljati to funkcijo".

Želim šifrirati besedo "AAAAAAAAAAAAAAA", pri čemer je moj ključ v številki reže "9" napisal:

ATCA_STATUS status = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () ni uspelo: Koda -> 0x")); Serial.println (status, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Izvirno besedilo uint8_t iv [IV_LENGTH_CBC]; // Začetni vektorski uint8_t cypherdata [sizeof (navadni tekst)]; // Podatki šifrirani status = aes_cbc_encrypt (& cfg, navadni tekst, velikostof (navadni tekst), iv, šifrirani podatki, 9);

Če je dejanje dobro, boste imeli šifrirane podatke v spremenljivki "cypherdata" in začetni vektor v spremenljivki "IV".

Za dešifriranje besedila hranite ti dve spremenljivki!

Drugi korak: dešifrirajte svoje podatke

Za dešifriranje podatkov potrebujete dve stvari:

  1. Začetni vektor
  2. Podatki Cypher (šifrirani podatki)

Za dešifriranje podatkov potrebujete to funkcijo:

/** / brief Dešifrirajte podatke z algoritmom AES CBC* / param [in] cfg Konfiguracija logičnega vmesnika. Nekatere vnaprej določene * konfiguracije najdete v atca_cfgs.h * / param [v] šifriranem besedu Besede za dešifriranje (deljeno s 16, največja dolžina 240) * / param [in] len Dolžina besed za dešifriranje (deljena s 16, največja dolžina 240) * / param [in] iv Začetni vektor za uporabo v AES CBC * / param [out] navadni tekst vrne sem dešifrirano besedilo * / param [in] ključ Številka reža ključa * / vrnitev ATCA_SUCCESS pri uspehu, sicer koda napake. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *šifrirano besedilo, int len, uint8_t *iv, uint8_t *plaintext, uint8_t ključ) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("Napaka pri dešifriranju: ATCA_BAD_PARAM")); vrnitev ATCA_BAD_PARAM; } ATCA_STATUS status = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, ključ, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("Napaka pri dešifriranju: atcab_aes_cbc_init, napaka kode 0x")); Serial.println (status, HEX); vrnitev; } int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & šifriran tekst [j * 16], & navadni tekst [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("Napaka pri dešifriranju: atcab_aes_cbc_encrypt_block, napaka kode 0x")); Serial.println (status, HEX); } stanje vrnitve; } stanje vrnitve; }

Dešifrirati želim svoje prejšnje podatke (glej spodaj, Prvi korak). Za to bom naredil naslednje:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t šifrirani podatki [sizeof (navadni tekst)]; uint8_t decryptdata [sizeof (navadni tekst)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Dešifrirano besedilo je:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Za kodo Error Serial.print si oglejte datoteko atca_status.h (F ("Dešifriranje nemogoče | Napaka kode 0x")); Serial.println (status, HEX); vrnitev; }

Če je dejanje dobro, boste imeli dešifrirane podatke v spremenljivki "decryptdata".

Zdaj veste, kako uporabljati šifriranje in dešifriranje s čipom Atecc608a

6. korak: 5. Zakaj morate uporabiti ta čip

Šifrirani podatki so zelo uporabni, saj lahko svoje podatke skrijete in pošljete prek brezžične povezave ali pa jih preprosto shranite.

Tu je nekaj primerov uporabe:

  1. Shranjeni podatki v zunanji EEPROM: Zaščitite lahko podatke zunanjega EEPROM -a in če nekdo še vedno uporablja ta EEPROM, bo za dešifriranje potreboval ključ in IV
  2. Pošlji brezžične podatke: te šifrirane podatke lahko pošljete prek brezžične povezave (nrf24L01, RFM95W …) in če kdo prestreže vaše podatke, bodo ti podatki zaščiteni
  3. Shranjeno geslo

S tem čipom lahko naredite več stvari. Lahko se uporablja v več projektih. Če imate čas, mi povejte, v katerem projektu boste uporabili ta čip?

Zadnji nasvet: če zgradite kakšen brezžični projekt ali shranite nekaj surovih podatkov, bodite previdni, varnost je zelo pomembna in če veste, kako "noob" preprosto prestreže ali ukrade vaše podatke. Zdaj z internetom ima lahko vsak v svojem računalniku zagnati skripte, samo da vas "kramp"!

7. korak: Zaključek

Upam, da vam bo ta članek koristen. Oprostite, če sem naredil napako v besedilu, vendar angleščina ni moj glavni jezik in govorim bolje, kot pišem.

Hvala, ker ste prebrali vse.

Uživaj.

Priporočena: