Përmbajtje:

Siguria me Arduino: Atecc608a: 7 hapa
Siguria me Arduino: Atecc608a: 7 hapa

Video: Siguria me Arduino: Atecc608a: 7 hapa

Video: Siguria me Arduino: Atecc608a: 7 hapa
Video: Глобальные тренды 2020 — от Agile до IoT / Java Tech Talk 2024, Korrik
Anonim
Siguria me Arduino: Atecc608a
Siguria me Arduino: Atecc608a
Siguria me Arduino: Atecc608a
Siguria me Arduino: Atecc608a

Tema

Pershendetje te gjitheve !

Ky është artikulli im i parë i udhëzimeve, kështu që shpresoj se do të jetë interesant për të gjithë ju.

Në këtë artikull, unë do t'ju shpjegoj se si të përdorni një mikro çip të quajtur "ATECC608A" që sigurojnë mjete të shumta sigurie.

Ky çip është projektuar nga MicroChip dhe është versioni i fundit i "chip CryptoAuthentication". Para këtij versioni, kishte "ATSHA204A" dhe "ATECC508A".

Pse vendosa të përdor versionin e fundit dhe jo versionin e mëparshëm?

Ky version është çipi më i avancuar dhe mori funksione që versioni i vjetër nuk i ka (Për shembull: moduli AES, moduli i mbrojtjes IO…).

Pse ky projekt?

Unë punoj në fushën e Sigurisë Kibernetike dhe si të gjithë më pëlqyen programimi dhe elektronika. Gjatë studimeve të mia, marr një konferencë me një specialist mbi Sigurinë IoT i cili na tregoi se Industrial nuk përdor Sigurinë në objektin e tyre IoT. Na tregova një dry që mund të hapet me telefonin tuaj inteligjent me anë të Bluetooth. Në dry, një fjali tha "Ky dry është më i sigurt se një dry kyç!". Kjo fjali e bëri atë të buzëqeshë dhe ai ndryshoi fjalinë "Ky dry është dryi më i keq i ndërtuar ndonjëherë!".

Ai na tregoi me kompjuterin e tij dhe një sniffer Bluetooth se çdo komandë e dërguar nga smartphone është e njëjtë çdo herë dhe është shumë e thjeshtë të kopjoni këtë komandë dhe ta dërgoni me telefonin tuaj të mençur. Ai na shpjegoi se "Siguria" për "Industriale" nuk është problemi kryesor. Ai na tregoi patate të skuqura (më pak se 0.60 $) që mund të shtojnë një shtresë sigurie në këto objekte.

Pas këtij demonstrimi, unë u përpoqa të gjej ndonjë projekt me burim të hapur që shton shtresën e sigurisë në objektin IoT, por nuk e gjeta kurrë.

Kështu që vendosa të punoj në një projekt që përdor shtresën e sigurisë për komunikimin midis dy objekteve IoT.

Cila është ideja ime?

Gjatë një komunikimi midis dy objekteve IoT, mund të ketë sulme të shumta: Njeriu i butë, Kopja e informacionit dhe më shumë.. Pra, ideja ime është shumë e thjeshtë:

  1. Përdorimi i të dhënave të koduara midis dy ose më shumë objekteve IoT.
  2. Furnizime me kosto të ulët
  3. Mund të punojë me një Arduino UNO

Tani do t'ju shpjegoj se si e zbatova këtë fotografi abstrakte me një çip Arduino dhe një Atecc608a. Në këtë artikull, unë do t'ju shpjegoj se si të përdorni Arduino UNO me ATECC608A.

Herën tjetër do të shkruaj një artikull në lidhje me komunikimin e dy objekteve.

Furnizimet

Ju duhen disa gjëra për këtë projekt:

  1. Arduino UNO ose MEGA (Çipi duhet të jetë Atmega 328 ose ATMEGA 2560)
  2. Çipi Atecc608A (kushton më pak se 0.80 $ secila, e lehtë për tu gjetur në faqen tuaj të internetit të furnizuesit)
  3. Përshtatës SOIC me 8 kunja
  4. Disa tela dhe rezistorë

Fleta e të dhënave e versionit të mëparshëm të këtij çipi (Atecc508a) është në dispozicion këtu -> Fleta e të dhënave Atecc508a

Hapi 1: Hap pas hapi

Hap pas hapi
Hap pas hapi

Në këtë artikull, unë do t'ju tregoj se si të modifikoni konfigurimin e këtij çipi dhe si të kriptoni të dhënat duke përdorur algoritmin AES CBC.

Ne do të ndjekim këto hapa:

  1. Dizajni i qarkut
  2. Konfigurimi i këtij çipi
  3. Shfrytëzimi i modulit AES CBC
  4. Pse keni nevojë të përdorni këtë çip

Për çdo hap, unë do të detajoj gjithçka për ju. Gjithashtu, shtova kodin tim në Github tim me komente për secilin funksion. Nëse keni ndonjë pyetje në lidhje me kodin tim ose këtë projekt, do të jem i lumtur t'ju përgjigjem.

Github im: Github im

Hapi 2: Paralajmërim për Atecc608a

Paralajmërim për Atecc608a
Paralajmërim për Atecc608a

Çipi Atecc608a nuk është një çip "i lehtë".

Së pari, dokumentacioni i këtij çipi është nën NDA kështu që nuk do ta gjeni të plotë në internet. Por nuk ka problem për këtë, fleta e të dhënave e versionit të mëparshëm është në dispozicion në Internet Datasheet Complete ATECC508A.

Së dyti, kur përdorni këtë çip ju duhet të kyçni konfigurimin e tij dhe është e pamundur të modifikoni konfigurimin e çipit nëse është i kyçur. Pra, kini kujdes kur do të kyçni Zonën e Konfigurimit dhe Zonën e të Dhënave.

Së treti, biblioteka e shkruar në C është shumë e madhe dhe e plotë, kështu që ju duhet të lexoni dokumentacionin e funksioneve që do të përdorni më parë.

Katër, biblioteka shkroi për këtë çip që nuk funksionon për Arduino UNO, por shtoi se nevojiten funksionalitete për të punuar me Arduino UNO.

Çipi ATECC608A

Ju mund të komunikoni me këtë çip nga I2C. Adresa e këtij çipi mund të modifikohet në konfigurim.

Ky çip përmban 16 lojëra elektronike të ndryshme që mund të përmbajnë lloje të ndryshme të të dhënave:

  1. Çelësi ECC (privat ose publik)
  2. Çelësi AES
  3. Të dhëna të tjera (si Sha hash ose thjesht fjalë)

Në rastin tonë, ne do të ruajmë AES Key në një vend të caktuar.

Hapi 3: 1. Dizajnimi i Qarkut

1. Dizajnimi i Qarkut
1. Dizajnimi i Qarkut
1. Dizajnimi i Qarkut
1. Dizajnimi i Qarkut

1. Dizajni i qarkut

Skema e këtij qarku është shumë e thjeshtë!

Ju duhet të përdorni energji 3.3V sepse rekomandimi është midis 2.0V dhe 5.5V, por unë preferova të përdor 3.3V.

Për këtë çip, normalisht ju keni një pikë në një cep të çipit, kjo pikë është Pin 1 i këtij bordi. Shtova pamjen kryesore të Atecc608a me numrin PIN sepse është një SOIC me 8 plumb, kështu që çipi është shumë i vogël.

  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)

Ju duhet të përdorni energji 3.3V sepse rekomandimi është midis 2.0V dhe 5.5V, por unë preferova të përdor 3.3V.

Shtova pamjen kryesore të Atecc608a sepse është një SOIC me 8 plumb, kështu që çipi është shumë i vogël. Nëse preferoni, kështu që furnizuesit ndërtojnë një bord me lidhësin e çipave, mund të jetë më e lehtë për ju.

Paralajmërim: Në rastin tim, më duhet të shtoj një rezistencë midis SDA të Arduino dhe Chip (gjithashtu për SDL). Shtova një rezistencë 4.7Kohm për secilën.

Hapi 4: 2. Konfigurimi i çipit (Atecc608a)

Para përdorimit të funksionit të kriptimit ose deshifrimit ju duhet të konfiguroni çipin. Në këtë hap, unë do të detajoj çdo hap që duhet të bëni për konfigurimin e këtij çipi.

Paralajmërim: ky hap është shumë i rëndësishëm dhe nëse i bllokoni zonat para fundit nuk mund t'i modifikoni ato.

Siç u shpjegua më parë, ky çip mori dy zona:

  1. Konfiguro Zonën
  2. Zona e të dhënave

Konfigurimi Zona mori një madhësi prej 128 bajtësh, por 16 bajtët e parë nuk mund të modifikohen.

Për të konfiguruar këtë çip, duhet të ndiqni dy hapa. Veryshtë shumë e rëndësishme të ndiqni çdo hap në rregull ose konfigurimi juaj nuk do të funksionojë, dhe çipi juaj do të jetë i kyçur dhe i papërdorshëm. Ato hapa janë:

  1. Krijoni një model konfigurimi
  2. Shkruani këtë model në çip
  3. Bllokoni zonën e konfigurimit
  4. Shkruani çelësin tuaj AES (128 Bits) në një vend të caktuar
  5. Bllokoni Zonën e të Dhënave

Informacion

Më poshtë unë detajoj çdo hap të konfigurimit me kodin tim, por mos u shqetësoni, shtova një shembull të plotë të konfigurimit në Github tim. Unë vendos komente për secilin funksion, dhe një skedar *.ino është i disponueshëm me secilin hap në rregull për ju.

  • Github im: Github im
  • Rruga e Shembullit Konfigurimi: configuration_example.ino

Hapi i parë: Krijoni një model konfigurimi

Siç u shpjegua më parë, zona e konfigurimit merr një madhësi prej 128 bit, por 16 bitët e parë nuk mund të ndryshohen. Kjo zonë përbëhet nga pjesë të shumta, por ju duhet të dini vetëm 3 pjesë të kësaj zone konfigurimi për këtë projekt:

  1. Bytes 16 -> Kjo është adresa I2C e çipit
  2. Bytes 20 në 51 -> Këtu mund të modifikoni llojin e slotit për 16 lojëra elektronike të këtij çipi
  3. Bytes 96 në 127 -> Ju mund të vendosni këtu Llojin e çelësit ose të dhënat e përdorura në secilën slot.

(Nëse keni nevojë për më shumë shpjegime për të gjithë këtë zonë, ju lutemi lexoni dokumentacionin (faqe 13, pjesa 2.2))

Këtu, unë vendos në detaje çdo Bajt/Pjesë të 112 bajtëve të konfigurimit të një Çipi. Ky është një shembull, secili çip i blerë mund të ketë një konfigurim të ndryshëm:

Adresa 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, 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, // Hapësira e konfigurimit të çelësit 1 0x33, 0x00, // Hapësira e konfigurimit të çelësit 2 0x33, 0x00, // Hapësira e konfigurimit të çelësit 3 0x1C, 0x00, // Hapësira e konfigurimit të çelësit 4 0x1C, 0x00, // Foleja kryesore e konfigurimit 5 0x 1C, 0x00, // Slot Config Key 6 0x1C, 0x00, // Slot Config Key 7 0x3C, 0x00, // Slot Config Key 8 0x1A, 0x00, // Slot Config Key 9 0x3A, 0x00, // Slot Config Key 10 0x1A, 0x00, // Slot Config Key 11 0x3A, 0x00, // Slot Config Key 12 0x3A, 0x00, // Slot Config Key 13 0x3C, 0x00, // Slot Config Key 14 0x3C, 0x00, // Slot Config Key 15 0x1C, 0x00 // Foleja e konfigurimit të çelësit 16

Siç shihet, unë vendos disa komente në këtë kod për të kuptuar më shumë këtë konfigurim.

Në rastin tuaj, duhet të kuptoni vetëm tre gjëra:

  1. Bytes 16 -> Kjo është adresa I2C e çipit
  2. Bytes 20 në 51 -> Këtu mund të modifikoni llojin e slotit për 16 lojëra elektronike të këtij çipi
  3. Byte 96 në 127 -> Ju mund të vendosni këtu Llojin e çelësit ose të dhënat e përdorura në secilën slot.

Unë nuk do të shpjegoj llojin e konfigurimit dhe pse e kam përdorur këtë dhe jo një tjetër sepse është e komplikuar të shpjegosh gjithçka. Nëse keni nevojë për më shumë informacion, shkoni te dokumentacioni, faqe 16 seksioni 2.2.1 për "SlotConfig" dhe faqja 19 seksioni 2.2.5 për "KeyConfig"

Për këtë shembull, do të përdorni slotin 9 për të ruajtur një çelës AES.

Për këtë, ne duhet të vendosim (nëse keni nevojë, mund të kopjoni shembullin e mësipërm, modifikimi është bërë në të):

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

Pse e vendosa këtë konfigurim: Për secilën pjesë të këtij çipi, mund të vendosni parametra për t'i thënë çipit se çfarë lloj të dhënash do të ruhen. Ju keni shumë parametra:

  • Slot mund të shkruhet ose lexohet (veprim i qartë ose i koduar)
  • Lloji i të dhënave të ruajtura (çelësi ECC, çelësi publik, SHA Hash, çelësi AES …)
  • Slot mund të bllokohet
  • Gjenerimi i çelësit lejohet

Me bajtin 36 dhe 37 të vendosur në "0x0F8F":

  • Të dhënat mund të shkruhen në Clear
  • Përmbajtja e këtij sloti është sekret dhe nuk mund të lexohet
  • Slot nuk mund të përdoret për komandën CheckMac Copy

Me bajtin 112 dhe 113 të vendosur në "0x001A":

Slot mund të ruajë deri në katër çelësa simetrik AES 128-bit (Tipi kryesor = 0x6)

Hapi i dytë: Shkruani këtë konfigurim

Ky hap është shumë i rëndësishëm sepse ne do ta vendosim çipin me konfigurimin tonë dhe nëse ky konfigurim nuk është i mirë, ju do ta përdorni këtë çip.

Por mos u shqetësoni, përderisa Konfigurimi nuk është i kyçur, mund të modifikoni konfigurimin tuaj.

Këtu, ky është kodi i përdorur për të shkruar konfigurimin në çip:

/** / shkurtër Shkruani një konfigurim të ri në çip.

* / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [in] config Array uint8_t e konfigurimit (gjatësia 112) * / param [in] len Madhësia e grupit të konfigurimit * / ktheni ATCA_SUCCESS në sukses, përndryshe një kod gabimi. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {nëse (len! = 112) kthe ATCA_BAD_PARAM; Statusi ATCA_STATUS; statusi = atcab_init (cfg); if (statusi == ATCA_SUCCESS) {// Shkruani grupin e konfigurimit në çip // Mbushja prej 16 bajtësh (16 bajtët e parë nuk mund të shkruhen) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); statusi i kthimit; } statusi i kthimit; }

Ky funksion do të shkruajë konfigurimin tuaj në çip.

Hapi i tretë: bllokoni zonën e konfigurimit

Paralajmërim: kini kujdes me këtë hap, nëse e bllokoni këtë Zonë dhe konfigurimi juaj nuk është i mirë, çipi është i papërdorshëm dhe ju nuk mund ta modifikoni këtë zonë

Për këtë veprim, ne do të përdorim këtë funksion:

/** / shkurt Kontrolloni nëse një DATA_ZONE ose CONFIG_ZONE është e kyçur

* / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [në] zonën LOCK_ZONE_DATA ose LOCK_ZONE_CONFIG * / ktheni ATCA_SUCCESS me sukses, përndryshe një kod gabimi. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, zona uint8_t) {statusi ATCA_STATUS; bool lock = false; nëse (zona! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) kthehet ATCA_BAD_PARAM; statusi = atcab_init (cfg); nëse (statusi == ATCA_SUCCESS) {nëse (ATCA_SUCCESS! = (statusi = atcab_is_locked (zone, & lock))) {return ATCA_FUNC_FAIL; } nëse (! bllokohet) {kthehu ATCA_NOT_LOCKED; } kthe ATCA_SUCCESS; } kthe ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Hapi i katërt: Shkruani çelësin AES në një çarë

Në këtë pjesë do të vendosni çelësin tuaj personal AES në folenë që keni përcaktuar në konfigurimin e çipit.

Për këtë shembull, unë do të përdor slotin numër 9 të çipit.

Duhet të dini: Një veçori e veçantë e këtij çipi është që ju mund të shkruani të dhëna në slot vetëm me 4 bajt ose 32 bajt. Për AES na duhen 128 bit bit Key kështu 16 bytes të dhëna. Kështu vendosa të shkruaj në çelësin prej 16 bajt secila në këtë slot për të pasur të dhëna 32 bajt.

Tani, unë do t'ju tregoj kodin e përdorur:

/** / shkurt Shkruani çelësin AES në një vend të caktuar. * / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [në] numrin e slotit të çelësit të çelësit * / param [in] array key dataakey uint8_t * / param [in] len Madhësia e grupit të çelësave * / kthe ATCA_SUCCESS në sukses, përndryshe një kod gabimi. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, çelësi uint8_t, uint8_t *datakey, size_t len) {nëse (çelësi 16) ktheni ATCA_BAD_PARAM; nëse (len! = 32) kthe ATCA_BAD_PARAM; ATCA_STATUS status = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (çelësi ATCA_ZONE_DATA, (uint16_t), 0, 0, dataakey, 32); nëse (status! = ATCA_SUCCESS) statusi i kthimit; } statusi i kthimit; }

Për këtë shembull, unë do të përdor dy çelësa AES me 16 bajt secila:

// Shembull i AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; shkruani_slot_key_ ((cfg, 9, shembull_i_çelës, madhësia (shembull_i_kyçit));

Nëse ky veprim është i mirë, tani, duhet të kaloni hapin e fundit "kyçni zonën e të dhënave"

Hapi i fundit: bllokoni Zonën e të Dhënave

Paralajmërim: kini kujdes me këtë hap, nëse e bllokoni këtë Zonë dhe të dhënat tuaja nuk janë vendosur, çipi është i papërdorshëm dhe ju nuk mund ta modifikoni këtë zonë

Për këtë veprim, ne do të përdorim këtë funksion:

/** / shkurt Kontrolloni nëse një DATA_ZONE ose CONFIG_ZONE është e kyçur

* / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [në] zonën LOCK_ZONE_DATA ose LOCK_ZONE_CONFIG * / ktheni ATCA_SUCCESS me sukses, përndryshe një kod gabimi. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, zona uint8_t) {statusi ATCA_STATUS; bool lock = false; nëse (zona! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) kthehet ATCA_BAD_PARAM; statusi = atcab_init (cfg); nëse (statusi == ATCA_SUCCESS) {nëse (ATCA_SUCCESS! = (statusi = atcab_is_locked (zone, & lock))) {return ATCA_FUNC_FAIL; } nëse (! bllokohet) {kthehu ATCA_NOT_LOCKED; } kthe ATCA_SUCCESS; } kthe ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Nëse ky veprim është i mirë, çipi juaj është gati për përdorim

Hapi 5: 3. Shfrytëzimi i modulit AES CBC

3. Shfrytëzimi i modulit AES CBC
3. Shfrytëzimi i modulit AES CBC

Unë do të shpjegoj se si të kriptoni dhe deshifroni të dhënat me algoritmin AES CBC dhe çipin Atecc608a.

Mbani mend: Para se të përdorni këtë funksion, duhet të konfiguroni çipin. Për këtë, ndiqni hapin 2 të këtij artikulli

Ky çip mori lloje të shumta të modulit AES (AES 128 bit), vetëm AES 128 bit është i mundur:

  1. AES normale
  2. AES CBC
  3. AES GCM (me hash GFM) (shiko wikipedia për më shumë shpjegime)

Për ta bërë më të lehtë përdorimin, krijova dy funksione:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Këto dy funksione janë në dispozicion në Github tim.

Sqarim

Unë zgjedh të përdor algoritmin AES CBC sepse është më i sigurt se bitët bazë AES 128. Ky algoritëm përdor një Vector Fillestar për të kriptuar të dhënat tuaja.

Informacion

Më poshtë unë detajoj secilin hap të metodës së kriptimit dhe deshifrimit. Por unë shkrova një kod për Arduino që përdor të dyja funksionet. Ju mund ta shihni këtë kod në Github tim:

  • Github: Github im
  • Shembull i kodit "Encrypt/Decrypt": AES_crypto_example.ino

Hapi i parë: Kriptoni të dhënat tuaja

Në këtë pjesë, unë do t'ju tregoj se si të kriptoni të dhënat tuaja.

Së pari do t'ju duhet ky funksion:

/** / shkurtër Kriptimi i të dhënave duke përdorur algoritmin AES CBC* / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [në] të dhëna Fjalët për të enkriptuar (duhet të ndahen me 16, gjatësia maksimale 240) * / param [në] gjatësi len e Fjalëve për të enkriptuar (duhet të ndahen me 16, gjatësia maksimale 240) * / param [out] iv Vektori fillestar i përdorur në AES CBC (ktheni vektorin në këtë var) * / param [out] ciphertext kthejeni këtu tekstin Cypher * / param [in] numrin kryesor të slotit të çelësi * / kthe ATCA_SUCCESS në sukses, përndryshe një kod gabimi. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *ciphertext, uint8_t key) {atca_aes_cbc_ctx_t ctx; nëse (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); kthehu ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS status = atcab_init (cfg); nëse (statusi == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, çelësi, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Gabim Kodi 0x")); Serial.println (statusi, HEX); kthim; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, të dhëna, len); int max = len / 16; për (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, Error Code 0x")); Serial.println (statusi, HEX); } statusi i kthimit; } statusi i kthimit; }

Ky funksion është i thjeshtë për t’u përdorur, duhet të vendosni dy gjëra:

  1. Një IV bosh (Vektori fillestar) prej 16 Bajt
  2. Të dhënat për të kriptuar (madhësia maksimale 240 Bytes)

Këtu është një shembull "si ta përdorni këtë funksion".

Unë dua të kodoj fjalën "AAAAAAAAAAAAAA", me çelësin tim të shkruar në numrin e slotit "9":

ATCA_STATUS status = atcab_init (& cfg); nëse (statusi = ATCA_SUCCESS) {Serial.println (F ("atcab_init () dështoi: Kodi -> 0x")); Serial.println (statusi, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Teksti origjinal uint8_t iv [IV_LENGTH_CBC]; // Vektori fillestar uint8_t cipherdata [madhësia (teksti i thjeshtë)]; // Statusi i koduar i të dhënave = aes_cbc_encrypt (& cfg, teksti i thjeshtë, madhësia (teksti i thjeshtë), iv, cipherdata, 9);

Nëse veprimi është i mirë, ju do të keni të dhënat e koduara në ndryshoren "cypherdata" dhe Vector Initial në variablën "IV".

Mbani ato dy ndryshore për të deshifruar tekstin tuaj!

Hapi i dytë: deshifroni të dhënat tuaja

Për të deshifruar të dhënat tuaja do t'ju duhen dy gjëra:

  1. Vektori fillestar
  2. Të dhënat Cypher (të dhëna të koduara)

Për të deshifruar të dhënat tuaja, do t'ju duhet ky funksion:

/** / shkurt Dëshifro të dhënat duke përdorur algoritmin AES CBC* / param [in] cfg Konfigurimi logjik i ndërfaqes. Disa konfigurime të paracaktuara * mund të gjenden në atca_cfgs.h * / param [in] ciphertext Fjalët për të deshifruar (duhet të ndahen me 16, gjatësia maksimale 240) * / param [në] gjatësi len e Fjalëve që deshifrohen (duhet të ndahen me 16, gjatësia maksimale 240) * / param [in] iv Vektori fillestar për t'u përdorur në AES CBC * / param [out] plaintext kthejeni këtu tekstin e deshifruar * / param [in] numrin e slotit të çelësit * / ktheni ATCA_SUCCESS në sukses, përndryshe një kod gabimi. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *ciphertext, int len, uint8_t *iv, uint8_t *plaintext, uint8_t key) {atca_aes_cbc_ctx_t ctx; nëse (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); kthehu ATCA_BAD_PARAM; } Statusi ATCA_STATUS = atcab_init (cfg); nëse (statusi == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, çelësi, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, Gabim Kodi 0x")); Serial.println (statusi, HEX); kthim; } int max = len / 16; për (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & plaintext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Gabim Kodi 0x")); Serial.println (statusi, HEX); } statusi i kthimit; } statusi i kthimit; }

Unë dua të deshifroj të dhënat e mia të mëparshme (shih më poshtë, Hapi i parë). Për këtë do ta bëj këtë:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cipherdata [madhësia (teksti i thjeshtë)]; uint8_t deshifroni të dhënat [madhësia (teksti i thjeshtë)]; statusi = aes_cbc_decrypt (& cfg, cipherdata, sizeof (cypherdata), iv, decryptdata, 9); if (statusi == ATCA_SUCCESS) {Serial.print ("Teksti i deshifruar është:"); për (size_t i = 0; i <sizeof (dekriptimi); i ++) {Serial.print ((char) deshifroj të dhënat ); } Serial.println (""); } else {// Shih skedarin atca_status.h për kodin Gabim Serial.print (F ("E pamundur të bëj deshifrimin | Gabimi i kodit 0x")); Serial.println (statusi, HEX); kthim; }

Nëse veprimi është i mirë, ju do të keni të dhënat e deshifruara në variablin "decryptdata".

Tani ju e dini se si të përdorni kriptimin dhe deshifrimin me çipin Atecc608a

Hapi 6: 5. Pse keni nevojë të përdorni këtë çip

Të dhënat e koduara janë shumë të dobishme sepse mund t'i fshehni informacionet tuaja dhe t'i dërgoni me Wireless ose thjesht t'i ruani.

Këtu janë disa shembuj të përdorimit:

  1. Të dhënat e ruajtura në një EEPROM të jashtëm: Ju mund të siguroni të dhëna të një EEPROM të jashtëm dhe nëse dikush e mban këtë EEPROM, ai do të ketë nevojë për Çelësin dhe IV për deshifrimin
  2. Dërgoni të dhëna pa tela: Ju mund t'i dërgoni këto të dhëna të koduara me Wireless (nrf24L01, RFM95W…) dhe nëse dikush përgjon të dhënat tuaja, këto të dhëna do të jenë të sigurta
  3. Fjalëkalimi i ruajtur

Ju mund të bëni shumë gjëra me këtë çip. Mund të përdoret në projekte të shumta. Nëse keni kohë, më thoni në cilin projekt do ta përdorni këtë çip?

Një këshillë e fundit, nëse ndërtoni një projekt pa tel ose ruani disa të dhëna të papërpunuara, jini të kujdesshëm, siguria është shumë e rëndësishme dhe nëse e dini se si është e thjeshtë për një “noob” të përgjojë ose vjedhë të dhënat tuaja. Tani me internetin, të gjithë mund të kenë skripte për tu nisur në kompjuterin e tyre vetëm për t'ju "hackuar"!

Hapi 7: Përfundimi

Shpresoj se ky artikull do të jetë i dobishëm për ju. Më falni nëse kam gabuar në tekstin tim, por anglishtja nuk është gjuha ime kryesore dhe flas më mirë sesa shkruaj.

Faleminderit që lexuat gjithçka.

Shijoje.

Recommended: