Sadržaj:

Sigurnost s Arduinom: Atecc608a: 7 koraka
Sigurnost s Arduinom: Atecc608a: 7 koraka

Video: Sigurnost s Arduinom: Atecc608a: 7 koraka

Video: Sigurnost s Arduinom: Atecc608a: 7 koraka
Video: Обзор и конфигурация модуля EBYTE LoRa 2024, Srpanj
Anonim
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a

Tema

Pozdrav svima !

Ovo je moj prvi članak o instrukcijama pa se nadam da će svima vama biti zanimljiv.

U ovom članku ću vam objasniti kako koristiti mikro čip pod nazivom "ATECC608A" koji pruža više sigurnosnih alata.

Ovaj čip je dizajnirao MicroChip i posljednja je verzija "CryptoAuthentication chip". Prije ove verzije postojali su "ATSHA204A" i "ATECC508A".

Zašto sam odlučio koristiti posljednju verziju, a ne prethodnu?

Ova je verzija najnapredniji čip i ima funkcionalnosti koje stara verzija nema (Na primjer: AES modul, IO zaštitni modul …).

Zašto ovaj projekt?

Radim u domeni CyberSecurity i kao i svi volio sam programiranje i elektroniku. Tijekom studija dobivam konferenciju sa stručnjakom za IoT Security koji nam je pokazao da Industrial ne koristi Security u svojim IoT objektima. Pokazao sam nam lokot koji se može otvoriti s vašim pametnim telefonom putem Bluetootha. Na lokotu je napisana rečenica "Ovaj katanac je najsigurniji od lokota s ključem!". Ova mu se rečenica nasmiješila i izmijenio je rečenicu "Ovaj katanac je najgori katanac koji je ikada napravljen!".

Pokazao nam je vlastitim računalom i Bluetooth njuškalom da je svaka naredba poslana s pametnog telefona svaki put ista i da je vrlo jednostavno kopirati ovu naredbu i poslati je s vašim pametnim telefonom. Objasnio nam je da "Sigurnost" za "Industriju" nije glavni problem. Pokazao nam je čipove (manje od 0,60 USD) koji bi mogli dodati sloj sigurnosti tim objektima.

Nakon ove demonstracije pokušao sam pronaći neki projekt otvorenog koda koji dodaje sigurnosni sloj IoT objektu, ali ga nikada nisam pronašao.

Stoga sam odlučio raditi na projektu koji koristi sigurnosni sloj za komunikaciju između dva IoT objekta.

Koja je moja ideja?

Tijekom komunikacije između dva IoT objekta može postojati više napada: Blagi čovjek, Kopija informacija i više.. Dakle, moja ideja je vrlo jednostavna:

  1. Korištenje šifriranih podataka između dva ili više IoT objekata.
  2. Povoljne zalihe
  3. Može raditi s Arduino UNO

Sada ću vam objasniti kako sam implementirao ovu apstraktnu sliku s čipom Arduino i Atecc608a. U ovom članku ću vam objasniti kako koristiti Arduino UNO s ATECC608A.

Sljedeći ću put napisati članak o komunikaciji dvaju objekata.

Pribor

Za ovaj projekt trebate nekoliko stvari:

  1. Arduino UNO ili MEGA (čip mora biti Atmega 328 ili ATMEGA 2560)
  2. Atecc608A čip (košta manje od 0,80 USD svaki, lako se nalazi na web stranici vašeg dobavljača)
  3. 8-pinski SOIC adapter
  4. Neke žice i otpornici

Tehnički list prethodne verzije ovog čipa (Atecc508a) dostupan je ovdje -> Tehnički list Atecc508a

Korak 1: Korak po korak

Korak po korak
Korak po korak

U ovom članku ću vam pokazati kako izmijeniti konfiguraciju ovog čipa i nakon toga kako šifrirati podatke pomoću AES CBC algoritma.

Slijedit ćemo ove korake:

  1. Dizajn sklopa
  2. Konfiguracija ovog čipa
  3. Korištenje AES CBC modula
  4. Zašto trebate koristiti ovaj čip

Za svaki korak ću vam sve detaljno objasniti. Također, dodao sam svoj kôd u svoj Github s komentarima za svaku funkciju. Ako imate pitanja o mom kodu ili ovom projektu, rado ću vam odgovoriti.

Moj Github: Moj Github

Korak 2: Upozorenje o Atecc608a

Upozorenje o Atecc608a
Upozorenje o Atecc608a

Čip Atecc608a nije "lak" čip.

Prvo, dokumentacija ovog čipa je pod NDA pa ga nećete pronaći u cijelosti na Internetu. No, u tome nema problema, podatkovna tablica prethodne verzije dostupna je na Internetskoj podatkovnoj tablici Kompletna ATECC508A.

Drugo, kada koristite ovaj čip, morate zaključati njegovu konfiguraciju i nemoguće je izmijeniti konfiguraciju čipa ako je zaključan. Zato budite oprezni pri zaključavanju Config Zone i Data Zone.

Treće, knjižnica napisana na jeziku C vrlo je velika i potpuna, pa morate pročitati dokumentaciju funkcija koje ćete prije koristiti.

Četvrto, knjižnica je napisala da ovaj čip ne radi za Arduino UNO, ali je dodala funkcionalnosti koje su mu potrebne za rad s Arduino UNO.

Čip ATECC608A

S ovim čipom možete komunicirati putem I2C -a. Adresa ovog čipa može se promijeniti u konfiguraciji.

Ovaj čip sadrži 16 različitih utora koji mogu sadržavati različite vrste podataka:

  1. ECC ključ (privatni ili javni)
  2. AES ključ
  3. Ostali podaci (poput Sha hasha ili samo riječi)

U našem slučaju pohranit ćemo AES ključ u jedan utor.

Korak 3: 1. Projektiranje kruga

1. Projektiranje kruga
1. Projektiranje kruga
1. Projektiranje kruga
1. Projektiranje kruga

1. Projektiranje sklopa

Shema ovog kruga je vrlo jednostavna!

Morate koristiti napajanje 3.3V jer je preporuka između 2.0V i 5.5V, ali ja sam radije koristio 3.3V.

Za ovaj čip, obično imate točku na kutu čipa, ta je točka Pin 1 ove ploče. Dodao sam pogled odozgo na Atecc608a s PIN brojem jer je to 8-olovni SOIC pa je čip vrlo mali.

  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 koristiti napajanje 3.3V jer je preporuka između 2.0V i 5.5V, ali ja sam radije koristio 3.3V.

Dodao sam pogled odozgo na Atecc608a jer je to 8-olovni SOIC pa je čip vrlo mali. Ako vam je draže, pa dobavljači grade ploču s lemljenjem čipova, moglo bi vam biti lakše.

Upozorenje: U mom slučaju moram dodati otpornik između SDA -e Arduina i čipa (također za SDL). Za svaki sam dodao otpornik od 4,7Kohm.

Korak 4: 2. Konfiguracija čipa (Atecc608a)

Prije uporabe funkcije šifriranja ili dešifriranja morate konfigurirati čip. U ovom koraku detaljno ću opisati sve korake koje trebate učiniti za konfiguraciju ovog čipa.

Upozorenje: ovaj korak je vrlo važan i ako zone zaključate prije kraja, ne možete ih izmijeniti.

Kao što je već objašnjeno, ovaj čip ima dvije zone:

  1. Konfiguriraj zonu
  2. Područje podataka

Konfiguracijska zona dobila je veličinu od 128 bajta, ali prvih 16 bajtova se ne može mijenjati.

Da biste konfigurirali ovaj čip, trebate slijediti dva koraka. Vrlo je važno slijediti sve korake kako vaša konfiguracija ne bi radila, a vaš čip će biti zaključan i neupotrebljiv. Ti koraci su:

  1. Izradite predložak konfiguracije
  2. Napišite ovaj predložak na čip
  3. Zaključajte Config Zone
  4. Upišite svoj AES ključ (128 bita) u utor
  5. Zaključajte podatkovnu zonu

Informacija

U nastavku detaljno opisujem svaki korak conifguration sa svojim kodom, ali bez brige, dodao sam potpuni primjer konfiguracije u svom Githubu. Stavljam komentare na svaku funkciju, a *.ino datoteka dostupna je sa svakim korakom kako bismo vam pomogli.

  • Moj Github: Moj Github
  • Put primjera konfiguracije: configuration_example.ino

Prvi korak: Izradite predložak konfiguracije

Kao što je već objašnjeno, konfiguracijska zona dobiva veličinu od 128 bita, ali prvih 16 bita nije moguće promijeniti. Ova se zona sastoji od više dijelova, ali morate znati samo 3 dijela ove konfiguracijske zone za ovaj projekt:

  1. Bajtovi 16 -> Ovo je I2C adresa čipa
  2. Bajtovi 20 do 51 -> Ovdje možete promijeniti vrstu utora za 16 utora ovog čipa
  3. Bajtovi 96 do 127 -> Ovdje možete postaviti vrstu ključa ili podataka koji se koriste u svakom utoru.

(Ako vam je potrebno dodatno objašnjenje cijele ove zone, pročitajte dokumentaciju (stranica 13, odjeljak 2.2))

Ovdje sam detaljno stavio svaki bajt/dio od 112 bajtova konfiguracije čipa. Ovo je primjer, svaki kupljeni čip može imati drugačiju konfiguraciju:

0xC0, // I2C adresa

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

Kao što vidite, stavio sam neke komentare u ovaj kôd kako bih bolje razumio ovu konfiguraciju.

U vašem slučaju morate razumjeti samo tri stvari:

  1. Bajtovi 16 -> Ovo je I2C adresa čipa
  2. Bajtovi 20 do 51 -> Ovdje možete promijeniti vrstu utora za 16 utora ovog čipa
  3. Bajt 96 do 127 -> Ovdje možete postaviti vrstu ključa ili podataka koji se koriste u svakom utoru.

Neću objašnjavati vrstu konfiguracije i zašto sam koristio ovu, a ne drugu jer je komplicirano sve objasniti. Ako trebate više informacija, idite u dokumentaciju, stranica 16, odjeljak 2.2.1 za "SlotConfig" i stranica 19, odjeljak 2.2.5 za "KeyConfig"

U ovom primjeru ćete koristiti utor 9 za spremanje AES ključa.

Za to moramo staviti (ako trebate, možete kopirati gornji primjer, izmjena je izvršena u njemu):

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

Zašto sam postavio ovu konfiguraciju: Za svaki utor ovog čipa možete postaviti parametre koji će čipu reći kakvu će vrstu podataka pohraniti. Imate više parametara:

  • Utor se može pisati ili čitati (akcija brisanja ili šifriranja)
  • Vrsta pohranjenih podataka (ECC ključ, javni ključ, SHA raspršivanje, AES ključ …)
  • Utor se može zaključati
  • Dopušteno je generiranje ključa

S bajtovima 36 i 37 postavljenim na "0x0F8F":

  • Podaci se mogu upisivati u Clear
  • Sadržaj ovog utora je tajan i ne može se čitati
  • Utor se ne može koristiti za naredbu CheckMac Copy

S bajtovima 112 i 113 postavljenim na "0x001A":

Utor može pohraniti do četiri AES 128-bitna simetrična ključa (KeyType = 0x6)

Drugi korak: Napišite ovu konfiguraciju

Ovaj korak je vrlo važan jer ćemo postaviti čip s našom konfiguracijom, a ako ta konfiguracija nije dobra, upotrijebit ćete ovaj čip.

Ali bez brige, sve dok konfiguracija nije zaključana, možete izmijeniti svoju konfiguraciju.

Evo koda koji se koristi za pisanje konfiguracije na čip:

/** / brief Napišite novu konfiguraciju u čip.

* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] config Array uint8_t konfiguracije (duljina 112) * / param [in] len Veličina konfiguracijskog niza * / vrati ATCA_SUCCESS pri uspjehu, inače kôd pogreške. */ ATCA_STATUS konfiguracija_zapisivanja (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) return ATCA_BAD_PARAM; ATCA_STATUS status; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Zapisuje konfiguracijski niz na čip // Odvajanje od 16 bajta (16 prvih bajtova se ne može upisati) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); status povratka; } status povratka; }

Ova funkcija zapisuje vašu konfiguraciju u čip.

Treći korak: zaključajte konfiguracijsku zonu

Upozorenje: Budite oprezni s ovim korakom, ako zaključate ovu zonu i vaša konfiguracija nije dobra, čip je neupotrebljiv i niste mogli promijeniti tu zonu

Za ovu radnju koristit ćemo ovu funkciju:

/** / brief Provjerite je li DATA_ZONE ili CONFIG_ZONE zaključan

* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] zoni LOCK_ZONE_DATA ili LOCK_ZONE_CONFIG * / vratiti ATCA_SUCCESS pri uspjehu, inače kôd pogreške. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, zona uint8_t) {ATCA_STATUS status; bool lock = false; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) vrati ATCA_BAD_PARAM; status = 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; } return ATCA_SUCCESS; } return ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Četvrti korak: Upišite vam AES ključ u utor

U ovom ćete dijelu postaviti svoj osobni AES ključ u utor koji ste definirali u konfiguraciji čipa.

U ovom primjeru koristit ću utor broj 9 čipa.

Morate znati: Posebna značajka ovog čipa je što možete upisivati podatke u utor samo za 4 ili 32 bajta. Za AES trebamo 128 -bitni ključ pa 16 bajtova podataka. Stoga sam odlučio napisati ključu od po 16 bajtova u ovom utoru kako bih imao podatke od 32 bajta.

Sada ću vam pokazati korišteni kod:

/** / short Napišite AES ključ u zadani utor. * / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] broj utora ključa * / param [in] niz ključeva podatkovnog ključa uint8_t * / param [in] len Veličina niza ključeva * / vrati ATCA_SUCCESS pri uspjehu, inače kôd pogreške. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (ključ 16) return ATCA_BAD_PARAM; if (len! = 32) vrati 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); if (status! = ATCA_SUCCESS) vraća status; } status povratka; }

U ovom primjeru koristit ću dva AES ključa od po 16 bajtova:

// Primjer AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_key_key, sizeof (example_key_key));

Ako je ova radnja dobra, sada morate proći posljednji korak "zaključavanje podatkovne zone"

Zadnji korak: zaključajte podatkovnu zonu

Upozorenje: Budite oprezni s ovim korakom, ako zaključate ovu zonu i vaši podaci nisu postavljeni, čip je neupotrebljiv i niste mogli promijeniti tu zonu

Za ovu radnju koristit ćemo ovu funkciju:

/** / brief Provjerite je li DATA_ZONE ili CONFIG_ZONE zaključan

* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] zoni LOCK_ZONE_DATA ili LOCK_ZONE_CONFIG * / vratiti ATCA_SUCCESS pri uspjehu, inače kôd pogreške. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, zona uint8_t) {ATCA_STATUS status; bool lock = false; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) vrati ATCA_BAD_PARAM; status = 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; } return ATCA_SUCCESS; } return ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Ako je ovo dobro, vaš čip je spreman za upotrebu

Korak 5: 3. Korištenje AES CBC modula

3. Korištenje AES CBC modula
3. Korištenje AES CBC modula

Objasnit ću kako kriptirati i dešifrirati podatke pomoću algoritma AES CBC i čipa Atecc608a.

Upamtite: Prije korištenja ove funkcije morate postaviti čip. U tu svrhu slijedite 2. korak ovog članka

Ovaj čip ima više vrsta AES modula (AES 128 bita), moguće je samo AES 128 bita:

  1. AES normalan
  2. AES CBC
  3. AES GCM (s GFM raspršivanjem) (za više objašnjenja pogledajte wikipedia)

Kako bih vam olakšao korištenje, stvorio sam dvije funkcije:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Te su dvije funkcije dostupne na mom Githubu.

Objašnjenje

Odlučio sam se koristiti AES CBC algoritmom jer je sigurniji od osnovnih AES 128 bitova. Ovaj algoritam koristi početni vektor za šifriranje vaših podataka.

Informacija

U nastavku donosim pojedinosti o svakom koraku metode šifriranja i dešifriranja. Ali napisao sam kod za Arduino koji koristi obje funkcije. Ovaj kôd možete vidjeti u mom Githubu:

  • Github: Moj Github
  • Primjer koda "Šifriraj/Dešifriraj": AES_crypto_example.ino

Prvi korak: Šifrirajte svoje podatke

U ovom dijelu ću vam pokazati kako šifrirati vaše podatke.

Prvo će vam trebati ova funkcija:

/** / brief Šifrirajte podatke pomoću AES CBC algoritma* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] data Riječi za enciptiranje (moraju se podijeliti sa 16, maksimalna duljina 240) * / param [in] len Dužina riječi za encypt (mora se podijeliti sa 16, maksimalna duljina 240) * / param [out] iv Početni vektor koji se koristi u AES CBC -u (vrati vektor u ovoj varijanti) * / param [out] šifrirani tekst vraća ovdje šifrirani tekst * / param [in] ključ Broj utora key * / return ATCA_SUCCESS o uspjehu, u protivnom kôd pogreške. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *podaci, int len, uint8_t *iv, uint8_t *šifrirani tekst, uint8_t ključ) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("POGREŠKA: ATCA_BAD_PARAM")); povrat 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 ("POGREŠKA Šifriranje: atcab_aes_cbc_init, greška koda 0x")); Serial.println (status, HEX); povratak; } 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], & šifrirani tekst [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (status, HEX); } status povratka; } status povratka; }

Ova je funkcija jednostavna za korištenje, morate postaviti dvije stvari:

  1. Prazan IV (početni vektor) od 16 bajtova
  2. Podaci za šifriranje (maksimalna veličina 240 bajtova)

Evo primjera "kako koristiti ovu funkciju".

Želim šifrirati riječ "AAAAAAAAAAAAAAA", pri čemu je moj ključ napisao u broju utora "9":

ATCA_STATUS status = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () nije uspio: Kôd -> 0x")); Serial.println (status, HEX); } uint8_t otvoreni tekst [16] = "AAAAAAAAAAAAAAA"; // Izvorni tekst uint8_t iv [IV_LENGTH_CBC]; // Početni vektor uint8_t cypherdata [sizeof (otvoreni tekst)]; // Podaci šifrirani status = aes_cbc_encrypt (& cfg, otvoreni tekst, veličinaof (otvoreni tekst), iv, cypherdata, 9);

Ako je akcija dobra, šifrirane podatke imat ćete u varijabli "cypherdata", a početni vektor u varijabli "IV".

Zadržite te dvije varijable za dešifriranje teksta!

Drugi korak: dešifrirajte svoje podatke

Za dešifriranje podataka trebat će vam dvije stvari:

  1. Početni vektor
  2. Cypher podaci (šifrirani podaci)

Za dešifriranje vaših podataka trebat će vam ova funkcija:

/** / short Dešifriranje podataka pomoću AES CBC algoritma* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [u] šifriranom tekstu Riječi za dešifriranje (moraju se podijeliti sa 16, maksimalna duljina 240) * / param [in] len Duljina riječi za deciptiranje (mora se podijeliti sa 16, maksimalna duljina 240) * / param [in] iv Početni vektor za korištenje u AES CBC * / param [out] otvoreni tekst ovdje vraća dešifrirani tekst * / param [in] ključ Broj utora ključa * / return ATCA_SUCCESS za uspjeh, inače kôd pogreške. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *šifrirani tekst, int len, uint8_t *iv, uint8_t *otvoreni tekst, uint8_t ključ) {atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("Dešifriranje pogreške: ATCA_BAD_PARAM")); povrat 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 ("ERROR Decrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (status, HEX); povratak; } int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & šifrirani tekst [j * 16], & otvoreni tekst [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (status, HEX); } status povratka; } status povratka; }

Želim dešifrirati svoje prethodne podatke (vidi dolje, Prvi korak). Za ovo ću učiniti sljedeće:

uint8_t otvoreni tekst [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (otvoreni tekst)]; uint8_t decryptdata [sizeof (otvoreni tekst)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Dešifrirani tekst je:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Pogledajte datoteku atca_status.h za kôd Error Serial.print (F ("Nemoguće je dešifriranje | Kôd Error 0x")); Serial.println (status, HEX); povratak; }

Ako je akcija dobra, dešifrirane podatke imat ćete u varijabli "decryptdata".

Sada znate koristiti šifriranje i dešifriranje s čipom Atecc608a

Korak 6: 5. Zašto trebate koristiti ovaj čip

Šifrirani podaci vrlo su korisni jer svoje podatke možete sakriti i poslati putem bežične veze ili ih jednostavno pohraniti.

Evo nekoliko primjera korištenja:

  1. Pohranjeni podaci na vanjski EEPROM: Možete zaštititi podatke vanjskog EEPROM -a, a ako netko još uvijek ima taj EEPROM, trebat će mu ključ i IV za dešifriranje
  2. Slanje bežičnih podataka: ove šifrirane podatke možete poslati putem bežične veze (nrf24L01, RFM95W …) i ako netko presretne vaše podatke, ti će podaci biti sigurni
  3. Pohranjena lozinka

S ovim čipom možete učiniti više stvari. Može se koristiti u više projekata. Ako imate vremena, recite mi u kojem ćete projektu koristiti ovaj čip?

Posljednji savjet, ako gradite neki bežični projekt ili pohranjujete sirove podatke, budite oprezni, sigurnost je vrlo važna i ako znate kako je "noob -u" jednostavno presresti ili ukrasti vaše podatke. S internetom, svatko može imati skripte za pokretanje na svom računalu samo kako bi vas "hakirao"!

Korak 7: Zaključak

Nadam se da će vam ovaj članak biti od koristi. Oprostite ako sam pogriješio u tekstu, ali engleski mi nije glavni jezik i govorim bolje nego što pišem.

Hvala što ste sve pročitali.

Uživaj.

Preporučeni: