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: Секрет опытных мастеров! Как легко состыковать материал, если в углу стоит круглая труба? #shorts 2024, Novembar
Anonim
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a
Sigurnost s Arduinom: Atecc608a

Tema

Zdravo 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 verzija je najnapredniji čip i ima funkcionalnosti koje stara verzija nema (Na primjer: AES modul, IO zaštitni modul …).

Zašto ovaj projekat?

Radim u domenu CyberSecurity -a i kao svi voleo sam programiranje i elektroniku. Tokom studija dobijam konferenciju sa stručnjakom za IoT Security koji nam je pokazao da Industrial ne koristi Security u svojim IoT objektima. Pokazao sam nam katanac koji se pomoću Bluetooth -a može otvoriti s vašim pametnim telefonom. Na lokotu je napisana rečenica "Ovaj katanac je najsigurniji od lokota s ključem!". Ova rečenica ga je nasmiješila i izmijenio je rečenicu "Ovaj katanac je najgori katanac koji je ikada napravljen!".

Pokazao nam je sa vlastitim računarom i Bluetooth njuškalom da je svaka naredba poslana sa 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 ovim 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?

Tokom 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. Potrošni materijal
  3. Može raditi sa 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 sa ATECC608A.

Sledeći put ću napisati članak o komunikaciji dva objekta.

Supplies

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.

Pratit ćemo ove korake:

  1. Dizajn kola
  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đe, dodao sam svoj kôd u svoj Github sa 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, biblioteka napisana na jeziku C je vrlo velika i potpuna, pa morate pročitati dokumentaciju funkcija koje ćete prije koristiti.

Četvrto, biblioteka 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

Sa ovim čipom možete komunicirati putem I2C. 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. Projektovanje kola

1. Projektovanje kola
1. Projektovanje kola
1. Projektovanje kola
1. Projektovanje kola

1. Dizajn kola

Shema ovog kola je vrlo jednostavna!

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

Za ovaj čip, obično imate tačku na uglu čipa, ova tačka je Pin 1 ove ploče. Dodao sam pogled odozgo na Atecc608a sa 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 3.3V napajanje jer je preporuka između 2.0V i 5.5V, ali ja bih radije koristio 3.3V.

Dodao sam pogled odozgo na Atecc608a jer je to 8-olovni SOIC pa je čip vrlo mali. Ako želite, 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 ću detaljno 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 ranije objašnjeno, ovaj čip ima dvije zone:

  1. Config Zone
  2. Data Zone

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

Da biste konfigurirali ovaj čip, morate 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. Kreirajte predložak konfiguracije
  2. Napišite ovaj predložak u čip
  3. Zaključajte Config Zone
  4. Upišite svoj AES ključ (128 bita) u utor
  5. Zaključajte zonu podataka

Informacije

U nastavku detaljno opisujem svaki korak konifgacije sa svojim kodom, ali bez brige, dodao sam potpuni primjer konfiguracije u svoj Github. Ja stavljam komentare na svaku funkciju, a *.ino datoteka je dostupna sa svakim korakom kako biste vi.

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

Prvi korak: Kreirajte 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 zona se 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 unosim detalje svakog bajta/dijela 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, // 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, // Konfiguracija utora Slot 15 0xAF, 0x8F, // Konfiguracija utora 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, 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 vam je potrebno 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 koristite utor 9 za spremanje AES ključa.

Za to moramo staviti (ako vam je potrebno, 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 kako biste rekli čipu koja će vrsta podataka biti pohranjena. Imate više parametara:

  • Utor se može pisati ili čitati (akcija brisanja ili šifriranja)
  • Vrsta pohranjenih podataka (ECC ključ, javni ključ, SHA hash, AES ključ …)
  • Prorez se može zaključati
  • Generiranje ključa je dozvoljeno

Sa 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 postavljenim bajtovima 112 i 113 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 prema našoj konfiguraciji, a ako ta konfiguracija nije dobra, vi ćete koristiti 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 čipu.

* / param [in] cfg Konfiguracija logičkog sučelja. Neke unaprijed definirane * konfiguracije mogu se pronaći u atca_cfgs.h * / param [in] config Niz uint8_t konfiguracije (dužina 112) * / param [in] len Veličina konfiguracijskog niza * / vraća ATCA_SUCCESS pri uspjehu, u suprotnom kôd greške. */ ATCA_STATUS konfiguracija_zapisivanja (ATCAIfaceCfg *cfg, uint8_t *konfiguracija, veličina_t lena) {if (len! = 112) vrati ATCA_BAD_PARAM; ATCA_STATUS status; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Zapisuje konfiguracijski niz na čip // Odstupanje 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 izmijeniti ovu zonu

Za ovu radnju koristit ćemo ovu funkciju:

/** / brief Proverite da li je 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, u suprotnom kod greš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 (zona, & zaključavanje))) {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 dijelu ćete postaviti svoj lični AES ključ u utor koji ste definirali u konfiguraciji čipa.

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

Morate znati: Posebna karakteristika ovog čipa je što možete upisivati podatke u utor samo 4 ili 32 bajta. Za AES trebamo 128 -bitni ključ, dakle 16 bajtova podataka. Zato sam odlučio pisati ključu od po 16 bajtova u ovom utoru kako bih imao podatke od 32 bajta.

Sada ću vam pokazati korišteni kod:

/** / brief Napišite AES ključ u dati 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 datakey uint8_t * / param [in] len Veličina niza ključeva * / vrati ATCA_SUCCESS pri uspjehu, u suprotnom kod greške. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (ključ 16) vrati 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 svaki:

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

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

Zadnji korak: zaključajte podatkovnu zonu

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

Za ovu radnju koristit ćemo ovu funkciju:

/** / brief Proverite da li je 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, u suprotnom kod greš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 (zona, & zaključavanje))) {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 ova akcija dobra, 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 šifrirati 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 (sa GFM hash -om) (za više objašnjenja pogledajte wikipedia)

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

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Te dvije funkcije su dostupne na mom Githubu.

Objašnjenje

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

Informacije

Ispod sam detaljno opisao svaki korak metode šifriranja i dešifriranja. Ali napisao sam kod za Arduino koji koristi obje funkcije. Ovaj kod 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] podacima Riječi za enciptiranje (moraju se podijeliti sa 16, maksimalna dužina 240) * / param [in] len Dužina riječi za enciptiranje (mora se podijeliti sa 16, maksimalna dužina 240) * / param [out] iv Inicijalni 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 pri uspjehu, u suprotnom kod greš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 ("GREŠKA: ATCA_BAD_PARAM")); return 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 ("ERROR Encrypt: atcab_aes_cbc_init, greška koda 0x")); Serial.println (status, HEX); return; } 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 funkcija je jednostavna za upotrebu, 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", s tim da je moj ključ napisao u utoru broj "9":

ATCA_STATUS status = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () nije uspio: Kod -> 0x")); Serial.println (status, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Originalni 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 potrebne su vam dvije stvari:

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

Za dešifriranje podataka potrebna vam je ova funkcija:

/** / brief Deš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] šifriranom tekstu Riječi za dešifriranje (moraju se podijeliti sa 16, maksimalna dužina 240) * / param [in] len Dužina riječi za deciptiranje (mora se podijeliti sa 16, maksimalna dužina 240) * / param [in] iv Početni vektor za upotrebu u AES CBC * / param [out] otvoreni tekst vraća ovdje dešifrirani tekst * / param [in] ključ Broj utora ključa * / return ATCA_SUCCESS za uspjeh, u suprotnom kod greš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 ("ERROR Decrypt: ATCA_BAD_PARAM")); return 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); return; } int max = len / 16; za (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & šifrirani tekst [j * 16], i 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 plaintext [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); return; }

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

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

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

Šifrirani podaci su vrlo korisni jer možete sakriti svoje podatke i poslati ih 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 neko još uvijek ima taj EEPROM, bit će mu potrebni 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 neko presretne vaše podatke, ti će podaci biti sigurni
  3. Pohranjena lozinka

S ovim čipom možete raditi 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. Sada s internetom, svako može imati skripte za pokretanje na svom računaru samo da vas "hakira"!

Korak 7: Zaključak

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

Hvala što ste sve pročitali.

Uživaj.

Preporučuje se: