Satura rādītājs:

Drošība ar Arduino: Atecc608a: 7 soļi
Drošība ar Arduino: Atecc608a: 7 soļi

Video: Drošība ar Arduino: Atecc608a: 7 soļi

Video: Drošība ar Arduino: Atecc608a: 7 soļi
Video: Laser Security System based on LDR SENSOR Project #sciencemodel #shorts #learnandfun #ldrsensor 2024, Jūlijs
Anonim
Drošība ar Arduino: Atecc608a
Drošība ar Arduino: Atecc608a
Drošība ar Arduino: Atecc608a
Drošība ar Arduino: Atecc608a

Temats

Sveiki visiem !

Šis ir mans pirmais Instructables raksts, tāpēc es ceru, ka tas būs interesants jums visiem.

Šajā rakstā es jums paskaidrošu, kā izmantot mikroshēmu ar nosaukumu "ATECC608A", kas nodrošina vairākus drošības rīkus.

Šo mikroshēmu ir izstrādājis MicroChip, un tā ir pēdējā "CryptoAuthentication chip" versija. Pirms šīs versijas bija "ATSHA204A" un "ATECC508A".

Kāpēc es nolēmu izmantot pēdējo versiju, nevis iepriekšējo?

Šī versija ir vismodernākā mikroshēma, un tai ir funkcijas, kuras vecajai versijai nav (piemēram: AES modulis, IO aizsardzības modulis …).

Kāpēc šis projekts?

Es strādāju kiberdrošības jomā un kā ikviens man patika programmēšana un elektronika. Studiju laikā man ir konference ar speciālistu par IoT drošību, kurš mums parādīja, ka Industrial neizmanto drošību savā IoT objektā. Es parādīju piekaramo atslēgu, kuru var atvērt, izmantojot viedtālruni, izmantojot Bluetooth. Pie piekaramās atslēgas teikums teica: "Šī piekaramā atslēga ir visdrošākā nekā atslēgu piekaramā atslēga!". Šis teikums liek viņam pasmaidīt, un viņš mainīja teikumu "Šī piekaramā atslēga ir visu laiku sliktākā piekaramā atslēga!".

Viņš mums parādīja ar savu datoru un Bluetooth snifferi, ka katra viedtālruņa sūtītā komanda katru reizi ir vienāda un šo komandu ir ļoti vienkārši nokopēt un nosūtīt ar viedtālruni. Viņš mums paskaidroja, ka "rūpnieciskā" "drošība" nav galvenā problēma. Viņš mums parādīja mikroshēmas (mazāk nekā 0,60 USD), kas šiem objektiem varētu pievienot drošības slāni.

Pēc šīs demonstrācijas es mēģināju atrast kādu atvērtā pirmkoda projektu, kas IoT objektam pievieno drošības slāni, bet es to nekad neatradu.

Tāpēc es nolēmu strādāt pie projekta, kas izmanto drošības slāni saziņai starp diviem IoT objektiem.

Kāda ir mana ideja?

Sazinoties starp diviem IoT objektiem, var būt vairāki uzbrukumi: Man Of the mild, Informācijas kopija un daudz kas cits.. Tātad mana ideja ir ļoti vienkārša:

  1. Šifrētu datu izmantošana starp diviem vai vairākiem IoT objektiem.
  2. Piegādes par zemām izmaksām
  3. Var strādāt ar Arduino UNO

Tagad es jums paskaidrošu, kā es īstenoju šo abstrakto attēlu ar Arduino un Atecc608a mikroshēmu. Šajā rakstā es jums paskaidrošu, kā izmantot Arduino UNO ar ATECC608A.

Es rakstīšu rakstu par divu objektu komunikāciju nākamreiz.

Piegādes

Šim projektam jums ir nepieciešamas dažas lietas:

  1. Arduino UNO vai MEGA (mikroshēmai jābūt Atmega 328 vai ATMEGA 2560)
  2. Atecc608A mikroshēma (katra maksā mazāk par 0,80 USD, viegli atrodama jūsu piegādātāja vietnē)
  3. 8 kontaktu SOIC adapteris
  4. Daži vadi un rezistori

Šīs mikroshēmas iepriekšējās versijas (Atecc508a) datu lapa ir pieejama šeit -> Datu lapa Atecc508a

1. solis: soli pa solim

Soli pa solim
Soli pa solim

Šajā rakstā es jums parādīšu, kā mainīt šīs mikroshēmas konfigurāciju un pēc tam, kā šifrēt datus, izmantojot AES CBC algoritmu.

Mēs izpildīsim šīs darbības:

  1. Ķēdes dizains
  2. Šīs mikroshēmas konfigurācija
  3. AES CBC moduļa izmantošana
  4. Kāpēc jums ir jāizmanto šī mikroshēma?

Par katru darbību es detalizēšu visu jūsu vietā. Turklāt es savā Github pievienoju savu kodu ar komentāriem par katru funkciju. Ja jums ir kādi jautājumi par manu kodu vai šo projektu, es labprāt uz to atbildēšu.

Mans Github: Mans Github

2. darbība. Brīdinājums par Atecc608a

Brīdinājums par Atecc608a
Brīdinājums par Atecc608a

Atecc608a mikroshēma nav "viegla" mikroshēma.

Pirmkārt, šīs mikroshēmas dokumentācija ir iekļauta NDA, tāpēc jūs to pilnībā neatradīsit internetā. Bet tam nav problēmu, iepriekšējās versijas datu lapa ir pieejama interneta datu lapā Complete ATECC508A.

Otrkārt, lietojot šo mikroshēmu, jums ir jābloķē tās konfigurācija, un nav iespējams mainīt mikroshēmas konfigurāciju, ja tā ir bloķēta. Tāpēc esiet piesardzīgs, kad bloķēsiet konfigurācijas zonu un datu zonu.

Treškārt, bibliotēka, kas rakstīta C valodā, ir ļoti liela un pilnīga, tāpēc jums ir jāizlasa iepriekš izmantoto funkciju dokumentācija.

Ceturtkārt, bibliotēka rakstīja, ka šī mikroshēma nedarbojas Arduino UNO, taču tā piebilda, ka funkcijām, kas nepieciešamas darbam ar Arduino UNO.

Mikroshēma ATECC608A

Jūs varat sazināties ar šo mikroshēmu, izmantojot I2C. Šīs mikroshēmas adresi var mainīt konfigurācijā.

Šajā mikroshēmā ir 16 dažādas laika nišas, kurās var būt dažāda veida dati:

  1. ECC atslēga (privāta vai publiska)
  2. AES atslēga
  3. Citi dati (piemēram, Sha hash vai tikai vārdi)

Mūsu gadījumā mēs uzglabāsim AES atslēgu vienā slotā.

3. solis: 1. Ķēdes projektēšana

1. Ķēdes projektēšana
1. Ķēdes projektēšana
1. Ķēdes projektēšana
1. Ķēdes projektēšana

1. Ķēdes dizains

Šīs shēmas shēma ir ļoti vienkārša!

Jums ir jāizmanto 3.3V jauda, jo ieteikums ir no 2.0V līdz 5.5V, bet es labāk izmantoju 3.3V.

Šai mikroshēmai parasti ir punkts uz mikroshēmas stūra, šis punkts ir šīs plāksnes 1. tapa. Es pievienoju Atecc608a augšējo skatu ar PIN numuru, jo tas ir 8 vadu SOIC, tāpēc mikroshēma ir ļoti maza.

  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)

Jums ir jāizmanto 3.3V jauda, jo ieteikums ir no 2.0V līdz 5.5V, bet es labāk izmantoju 3.3V.

Es pievienoju Atecc608a skatu no augšas, jo tas ir 8 vadu SOIC, tāpēc mikroshēma ir ļoti maza. Ja vēlaties, piegādātāji izveido kādu plāksni ar mikroshēmas lodmetālu, jums varētu būt vieglāk.

Brīdinājums: manā gadījumā man ir jāpievieno rezistors starp Arduino SDA un mikroshēmu (arī SDL). Katram es pievienoju 4,7Kohm rezistoru.

4. darbība: 2. mikroshēmas konfigurēšana (Atecc608a)

Pirms izmantot šifrēšanas vai atšifrēšanas funkciju, jums ir jākonfigurē mikroshēma. Šajā solī es sīki aprakstīšu visas darbības, kas jums jāveic, lai konfigurētu šo mikroshēmu.

Brīdinājums: šis solis ir ļoti svarīgs, un, ja bloķējat zonas pirms beigām, tās nevar mainīt.

Kā paskaidrots iepriekš, šai mikroshēmai ir divas zonas:

  1. Konfigurācijas zona
  2. Datu zona

Konfigurācijas zonas izmērs ir 128 baiti, bet pirmos 16 baitus nevar mainīt.

Lai konfigurētu šo mikroshēmu, jums jāveic divas darbības. Ir ļoti svarīgi ievērot katru darbību secībā, pretējā gadījumā jūsu konfigurācija nedarbosies, un jūsu mikroshēma tiks bloķēta un nelietojama. Šie soļi ir:

  1. Izveidojiet konfigurācijas veidni
  2. Uzrakstiet šo veidni mikroshēmā
  3. Bloķējiet konfigurācijas zonu
  4. Ierakstiet AES atslēgu (128 biti) slotā
  5. Datu zonas bloķēšana

Informācija

Zemāk es sīki izklāstu katru konfigurācijas soli ar savu kodu, taču neuztraucieties, es savā Github pievienoju pilnu konfigurācijas piemēru. Es ievietoju komentārus par katru funkciju, un *.ino fails ir pieejams ar katru soli, lai jūs varētu.

  • Mans Github: Mans Github
  • Konfigurācijas piemēra ceļš: configuration_example.ino

Pirmais solis: izveidojiet konfigurācijas veidni

Kā paskaidrots iepriekš, konfigurācijas zona iegūst 128 bitu lielumu, bet pirmos 16 bitus nevar mainīt. Šī zona sastāv no vairākām daļām, taču šim projektam jums jāzina tikai 3 šīs konfigurācijas zonas daļas:

  1. Baiti 16 -> Šī ir mikroshēmas I2C adrese
  2. Baiti no 20 līdz 51 -> Šeit varat mainīt slota veidu šīs mikroshēmas 16 slotiem
  3. Baiti no 96 līdz 127 -> Šeit varat iestatīt katrā slotā izmantotās atslēgas vai datu veidu.

(Ja jums ir nepieciešams plašāks šīs zonas skaidrojums, lūdzu, izlasiet dokumentāciju (13. lpp., 2.2. Sadaļa))

Šeit es detalizēti ievietoju katru mikroshēmas konfigurācijas 112 baitu baitu/daļu. Šis ir piemērs, katrai nopirktajai mikroshēmai var būt atšķirīga konfigurācija:

0xC0, // I2C adrese

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, 0x00, 0x33, 0x00, // Taustiņu konfigurācijas slots 1 0x33, 0x00, // Taustiņu konfigurācijas slots 2 0x33, 0x00, // Taustiņu konfigurācijas slots 3 0x1C, 0x00, // Taustiņu konfigurācijas slots 4 0x1C, 0x00, // Atslēgas konfigurācijas slots 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 // Taustiņu konfigurācijas slots 16

Kā redzams, es ievietoju dažus komentārus šajā kodā, lai labāk izprastu šo konfigurāciju.

Jūsu gadījumā jums ir jāsaprot tikai trīs lietas:

  1. Baiti 16 -> Šī ir mikroshēmas I2C adrese
  2. Baiti no 20 līdz 51 -> Šeit varat mainīt slota veidu šīs mikroshēmas 16 slotiem
  3. Baiti no 96 līdz 127 -> Šeit varat iestatīt katrā slotā izmantotās atslēgas vai datu veidu.

Es nepaskaidrošu konfigurācijas veidu un kāpēc es izmantoju šo, nevis citu, jo visu izskaidrot ir sarežģīti. Ja jums nepieciešama plašāka informācija, skatiet dokumentāciju, 16. lappuses 2.2.1. Sadaļu "SlotConfig" un 19. lapu 2.2.5. Sadaļu "KeyConfig"

Šajā piemērā AES atslēgas glabāšanai izmantosiet slotu 9.

Šim nolūkam mums ir jāievieto (ja nepieciešams, varat nokopēt iepriekš minēto piemēru, modifikācija tajā ir veikta):

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

Kāpēc es iestatīju šo konfigurāciju: katrai šīs mikroshēmas slotā varat iestatīt parametrus, lai mikroshēmai pateiktu, kāda veida dati tiks saglabāti. Jums ir vairāki parametri:

  • Slotu var rakstīt vai lasīt (notīrīt vai šifrēt)
  • Saglabāto datu veids (ECC atslēga, publiskā atslēga, SHA hash, AES atslēga …)
  • Slots var būt aizslēdzams
  • Atslēgas ģenerēšana ir atļauta

Kad 36 un 37 baiti ir iestatīti uz "0x0F8F":

  • Datus var ierakstīt skaidrā
  • Šī slota saturs ir slepens un to nevar izlasīt
  • Slotu nevar izmantot komandai CheckMac Copy

Ja baiti 112 un 113 ir iestatīti uz "0x001A":

Slots var uzglabāt līdz četrām AES 128 bitu simetriskām atslēgām (KeyType = 0x6)

Otrais solis: uzrakstiet šo konfigurāciju

Šis solis ir ļoti svarīgs, jo mēs iestatīsim mikroshēmu atbilstoši savai konfigurācijai, un, ja šī konfigurācija nav laba, jūs izmantosit šo mikroshēmu.

Bet neuztraucieties, kamēr konfigurācija nav bloķēta, jūs varat mainīt savu konfigurāciju.

Šeit ir šis kods, ko izmanto, lai ierakstītu konfigurāciju mikroshēmā:

/** / īss Ierakstiet mikroshēmā jaunu konfigurāciju.

* / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] config Array uint8_t konfigurācija (garums 112) * / param [in] len Konfigurācijas masīva izmērs * / return ATCA_SUCCESS on success, citādi kļūdas kods. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) return ATCA_BAD_PARAM; ATCA_STATUS statuss; statuss = atcab_init (cfg); if (statuss == ATCA_SUCCESS) {// Uzrakstiet mikroshēmā konfigurācijas masīvu // 16 baitu pildījums (16 pirmos baitus nevar ierakstīt) statuss = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); atgriešanās statuss; } atgriešanās statuss; }

Šī funkcija ierakstīs jūsu konfigurāciju mikroshēmā.

Trešais solis: bloķējiet konfigurācijas zonu

Brīdinājums: esiet piesardzīgs, veicot šo darbību, ja jūs bloķējat šo zonu un jūsu konfigurācija nav laba, mikroshēma ir nelietojama un jūs nevarat mainīt šo zonu

Šai darbībai mēs izmantosim šo funkciju:

/** / īsi Pārbaudiet, vai a DATA_ZONE vai CONFIG_ZONE ir bloķēta

* / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] zonā LOCK_ZONE_DATA vai LOCK_ZONE_CONFIG * / atgriež ATCA_SUCCESS, citādi kļūdas kods. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zona) {ATCA_STATUS statuss; bool lock = nepatiess; ja (zona! = (uint8_t) LOCK_ZONE_CONFIG && zona! = (uint8_t) LOCK_ZONE_DATA) atgriež ATCA_BAD_PARAM; statuss = atcab_init (cfg); ja (statuss == ATCA_SUCCESS) {ja (ATCA_SUCCESS! = (status = atcab_is_locked (zona, & lock))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } atgriezties ATCA_SUCCESS; } atgriezties ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Ceturtais solis: ierakstiet AES atslēgu slotā

Šajā daļā jūs iestatīsit personisko AES atslēgu slotā, kuru esat definējis mikroshēmas konfigurācijā.

Šajā piemērā es izmantošu mikroshēmas slota numuru 9.

Jums jāzina: Šīs mikroshēmas īpašā iezīme ir tā, ka jūs varat ierakstīt datus slotā tikai par 4 baitiem vai 32 baitiem. AES mums ir nepieciešama 128 bitu atslēga, tātad 16 baiti datu. Tāpēc es nolēmu rakstīt uz 16 baitu atslēgu katrā šajā slotā, lai būtu 32 baitu dati.

Tagad es jums parādīšu izmantoto kodu:

/** / īss Ierakstiet AES atslēgu noteiktā slotā. * / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] taustiņu slota numurs * / param [in] datakey atslēgu masīvs uint8_t * / param [in] len Atslēgu masīva izmērs * / return ATCA_SUCCESS on success, citādi kļūdas kods. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t atslēga, uint8_t *datakey, size_t len) {if (16. atslēga) atgriežas ATCA_BAD_PARAM; ja (len! = 32) atgriežas ATCA_BAD_PARAM; ATCA_STATUS statuss = atcab_init (cfg); ja (statuss == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) atslēga, 0, 0, datakey, 32); if (statuss! = ATCA_SUCCESS) atgriešanās statuss; } atgriešanās statuss; }

Šajā piemērā es izmantošu divas AES atslēgas ar 16 baitiem katrā:

// AES KEY piemērs (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key)));

Ja šī darbība ir laba, tagad jums jāiziet pēdējais solis "bloķēt datu zonu"

Pēdējais solis: bloķējiet datu zonu

Brīdinājums: esiet piesardzīgs, veicot šo darbību, ja bloķējat šo zonu un jūsu dati nav iestatīti, mikroshēma ir nelietojama un jūs nevarat mainīt šo zonu

Šai darbībai mēs izmantosim šo funkciju:

/** / īsi Pārbaudiet, vai a DATA_ZONE vai CONFIG_ZONE ir bloķēta

* / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] zonā LOCK_ZONE_DATA vai LOCK_ZONE_CONFIG * / atgriež ATCA_SUCCESS, citādi kļūdas kods. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zona) {ATCA_STATUS statuss; bool lock = nepatiess; ja (zona! = (uint8_t) LOCK_ZONE_CONFIG && zona! = (uint8_t) LOCK_ZONE_DATA) atgriež ATCA_BAD_PARAM; statuss = atcab_init (cfg); ja (statuss == ATCA_SUCCESS) {ja (ATCA_SUCCESS! = (status = atcab_is_locked (zona, & lock))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } atgriezties ATCA_SUCCESS; } atgriezties ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Ja šī darbība ir laba, jūsu mikroshēma ir gatava lietošanai

5. solis: 3. AES CBC moduļa izmantošana

3. AES CBC moduļa izmantošana
3. AES CBC moduļa izmantošana

Es paskaidrošu, kā šifrēt un atšifrēt datus, izmantojot algoritmu AES CBC un mikroshēmu Atecc608a.

Atcerieties: pirms šīs funkcijas izmantošanas ir jāiestata mikroshēma. Lai to izdarītu, izpildiet šī raksta 2. darbību

Šī mikroshēma saņēma vairāku veidu AES moduli (AES 128 biti), ir iespējami tikai AES 128 biti:

  1. AES normāls
  2. AES CBC
  3. AES GCM (ar GFM hash) (sīkāku informāciju skatiet wikipedia)

Lai atvieglotu lietošanu, es izveidoju divas funkcijas:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Šīs divas funkcijas ir pieejamas manā Github.

Izskaidrošana

Es izvēlos izmantot AES CBC algoritmu, jo tas ir drošāks par pamata AES 128 bitiem. Šis algoritms izmanto sākotnējo vektoru, lai šifrētu jūsu datus.

Informācija

Zemāk es sīki aprakstīju katru šifrēšanas un atšifrēšanas metodes soli. Bet es uzrakstīju kodu Arduino, kas izmanto šīs abas funkcijas. Šo kodu varat redzēt manā Github:

  • Github: Mans Github
  • Šifrēšanas/atšifrēšanas koda piemērs: AES_crypto_example.ino

Pirmais solis: šifrējiet savus datus

Šajā daļā es parādīšu, kā šifrēt jūsu datus.

Vispirms jums būs nepieciešama šī funkcija:

/** / īss Šifrēt datus, izmantojot AES CBC algoritmu* / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] datos Šifrējamie vārdi (jāsadala ar 16, maksimālais garums 240) * / param [in] len šifrējamo vārdu garums (jāsadala ar 16, maksimālais garums 240) * / param [out] iv Sākotnējais vektors, kas izmantots AES CBC (atdod vektoru šajā variantā) * / param [out] šifrēts teksts atgriežas šeit Šifra teksts * / param [in] taustiņš Vietas numurs atslēga * / atgriezt ATCA_SUCCESS par panākumiem, pretējā gadījumā kļūdas kods. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *dati, int len, uint8_t *iv, uint8_t *šifrēts teksts, uint8_t atslēga) {atca_aes_cbc_ctx_t ctx; ja (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); atgriezt ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS statuss = atcab_init (cfg); ja (statuss == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, atslēga, 0, tmp_iv); ja (statuss! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (statuss, HEX); atgriešanās; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; par (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], un šifrēts teksts [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (statuss, HEX); } atgriešanās statuss; } atgriešanās statuss; }

Šī funkcija ir vienkārša lietošanā, jums ir jāiestata divas lietas:

  1. Tukšs IV (sākotnējais vektors) no 16 baitiem
  2. Šifrējamie dati (maksimālais lielums 240 baiti)

Šeit ir piemērs "kā izmantot šo funkciju".

Es vēlos šifrēt vārdu "AAAAAAAAAAAAAAA", ar atslēgu ierakstot slota numuru "9":

ATCA_STATUS statuss = atcab_init (& cfg); ja (statuss! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () neizdevās: kods -> 0x")); Serial.println (statuss, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Oriģinālais teksts uint8_t iv [IV_LENGTH_CBC]; // Sākotnējais vektors uint8_t cypherdata [sizeof (vienkāršs teksts)]; // Datu šifrēts statuss = aes_cbc_encrypt (& cfg, vienkāršs teksts, sizeof (vienkāršs teksts), iv, ciprodati, 9);

Ja darbība ir laba, šifrētie dati būs mainīgajā "cypherdata", bet sākotnējais vektors - mainīgajā "IV".

Saglabājiet šos divus mainīgos, lai atšifrētu tekstu!

Otrais solis: atšifrējiet savus datus

Lai atšifrētu savus datus, jums būs nepieciešamas divas lietas:

  1. Sākotnējais vektors
  2. Cypher dati (šifrēti dati)

Lai atšifrētu savus datus, jums būs nepieciešama šī funkcija:

/** / īss Atšifrēt datus, izmantojot AES CBC algoritmu* / param [in] cfg Loģiskās saskarnes konfigurācija. Dažas iepriekš definētas * konfigurācijas ir atrodamas atca_cfgs.h * / param [in] ciphertext Vārdi atšifrēšanai (jāsadala ar 16, maksimālais garums 240) * / param [in] len atšifrējamo vārdu garums (jāsadala ar 16, maksimālais garums 240) * / param [in] iv Sākotnējais vektors, ko izmantot AES CBC * / param [out] vienkāršs teksts, atgriež šeit atšifrētu tekstu * / param [in] taustiņš Atslēgas vietas numurs * / atgriešanās ATCA_SUCCESS par panākumiem, pretējā gadījumā kļūdas kods. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *šifrēts teksts, int len, uint8_t *iv, uint8_t *plaintext, uint8_t atslēga) {atca_aes_cbc_ctx_t ctx; ja (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); atgriezt ATCA_BAD_PARAM; } ATCA_STATUS statuss = atcab_init (cfg); ja (statuss == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, atslēga, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, koda kļūda 0x")); Serial.println (statuss, HEX); atgriešanās; } int max = len / 16; par (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & šifrēts teksts [j * 16] un vienkāršs teksts [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (statuss, HEX); } atgriešanās statuss; } atgriešanās statuss; }

Es vēlos atšifrēt savus iepriekšējos datus (skatīt zemāk, Pirmais solis). Šim nolūkam es darīšu šādi:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (vienkāršs teksts)]; uint8_t atšifrēt datus [sizeof (vienkāršs teksts)]; statuss = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Atšifrēts teksts ir:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Skatiet failu atca_status.h, lai atrastu kodu Error Serial.print (F ("Neiespējami atšifrēt | Koda kļūda 0x")); Serial.println (statuss, HEX); atgriešanās; }

Ja darbība ir laba, atšifrētie dati būs mainīgajā "decryptdata".

Tagad jūs zināt, kā izmantot šifrēšanu un atšifrēšanu ar mikroshēmu Atecc608a

6. darbība: 5. Kāpēc jums ir jāizmanto šī mikroshēma?

Šifrēti dati ir ļoti noderīgi, jo jūs varat paslēpt savu informāciju un nosūtīt to, izmantojot bezvadu savienojumu, vai vienkārši to saglabāt.

Šeit ir daži izmantošanas piemēri:

  1. Saglabātie dati ārējā EEPROM: varat aizsargāt ārējā EEPROM datus, un, ja kāds joprojām atrodas šajā EEPROM, viņam būs nepieciešama atslēga un IV atšifrēšanai.
  2. Sūtīt bezvadu datus: šos šifrētos datus varat nosūtīt, izmantojot bezvadu savienojumu (nrf24L01, RFM95W…), un, ja kāds pārtver jūsu datus, šie dati būs droši
  3. Saglabātā parole

Ar šo mikroshēmu jūs varat darīt vairākas lietas. To var izmantot vairākos projektos. Ja jums ir laiks, sakiet man, kādā projektā jūs izmantosit šo mikroshēmu?

Pēdējais padoms, ja veidojat kādu bezvadu projektu vai glabājat neapstrādātus datus, esiet piesardzīgs, drošība ir ļoti svarīga un ja jūs zināt, kā “noobam” ir vienkārši pārtvert vai nozagt jūsu datus. Tagad, izmantojot internetu, ikvienam var būt skripti, ko palaist savā datorā, lai tikai "uzlauztu" jūs!

7. solis. Secinājums

Es ceru, ka šis raksts jums būs noderīgs. Atvainojiet, ja kļūdījos tekstā, bet angļu valoda nav mana galvenā valoda, un es runāju labāk nekā rakstu.

Paldies, ka izlasījāt visu.

Izbaudi to.

Ieteicams: