Orodha ya maudhui:

Usalama Na Arduino: Atecc608a: Hatua 7
Usalama Na Arduino: Atecc608a: Hatua 7

Video: Usalama Na Arduino: Atecc608a: Hatua 7

Video: Usalama Na Arduino: Atecc608a: Hatua 7
Video: Lesson 06: Arduino Variables Data Types | Robojax Arduino Step By Step Course 2024, Julai
Anonim
Usalama Na Arduino: Atecc608a
Usalama Na Arduino: Atecc608a
Usalama Na Arduino: Atecc608a
Usalama Na Arduino: Atecc608a

Mada

Halo kila mtu!

Hii ni Nakala yangu ya kwanza ya Maagizo kwa hivyo natumai itakuwa ya kufurahisha kwa nyinyi nyote.

Katika nakala hii, nitakuelezea jinsi ya kutumia chip ndogo inayoitwa "ATECC608A" ambayo hutoa zana nyingi za usalama.

Chip hiki kimeundwa na MicroChip na ndio toleo la mwisho la "Chip ya Uthibitishaji wa Crypto". Kabla ya toleo hili, kulikuwa na "ATSHA204A" na "ATECC508A".

Kwa nini niliamua kutumia toleo la mwisho na sio toleo la awali?

Toleo hili ni chip ya hali ya juu zaidi na ina kazi ambazo toleo la zamani halina (Kwa mfano: Moduli ya AES, moduli ya ulinzi wa IO…).

Kwa nini mradi huu?

Ninafanya kazi katika uwanja wa CyberSecurity na kama kila mtu nilipenda programu na vifaa vya elektroniki. Wakati wa masomo yangu, napata mkutano na mtaalam juu ya Usalama wa IoT ambaye alituonyesha kuwa Viwanda haitumii Usalama katika kitu chao cha IoT. Nilituonyesha kufuli ambayo inaweza kuwa wazi na smartphone yako na Bluetooth. Kwenye kufuli, sentensi ilisema "Kufuli hii ni salama zaidi kuliko kufuli!". Sentensi hii humfanya atabasamu na akabadilisha sentensi "Kufuli hii ndio kufuli mbaya kabisa kuwahi kujengwa!".

Alituonyesha na PC yake mwenyewe na kifaa cha kunusa Bluetooth kuwa kila amri inayotumwa na smartphone ni sawa kila wakati na ni rahisi sana kunakili amri hii na kuituma na smartphone yako. Alituelezea kuwa "Usalama" wa "Viwanda" sio shida kuu. Alituonyesha chips (chini ya $ 0.60) ambazo zinaweza kuongeza safu ya usalama kwa vitu hivi.

Baada ya onyesho hili, nilijaribu kupata mradi wa chanzo wazi ambao unaongeza safu ya usalama kwa kitu cha IoT lakini sikuwahi kuipata.

Kwa hivyo niliamua kufanya kazi kwenye mradi ambao unatumia safu ya usalama kwa mawasiliano kati ya kitu mbili cha IoT.

Je! Wazo langu ni nini?

Wakati wa mawasiliano kati ya kitu mbili cha IoT, mashambulio kadhaa yanaweza kuwapo: Mtu wa upole, Nakala ya habari na zaidi.. Kwa hivyo wazo langu ni rahisi sana:

  1. Utumiaji wa data iliyosimbwa kwa njia fiche kati ya kitu cha IoT mbili au zaidi.
  2. Vifaa vya gharama nafuu
  3. Unaweza kufanya kazi na Arduino UNO

Sasa nitakuelezea jinsi nilivyotekeleza picha hii ya kufikirika na Arduino na chip ya Atecc608a. Katika nakala hii, nitakuelezea jinsi ya kutumia Arduino UNO na ATECC608A.

Nitaandika nakala juu ya mawasiliano ya vitu viwili wakati mwingine.

Vifaa

Unahitaji vitu kadhaa kwa mradi huu:

  1. Arduino UNO au MEGA (Chip lazima iwe Atmega 328 au ATMEGA 2560)
  2. Chip ya Atecc608A (gharama chini ya $ 0.80 kila moja, ni rahisi kupata kwenye wavuti ya muuzaji wako)
  3. Adapter 8-Pin SOIC
  4. Baadhi ya waya na vipinga

Hati ya data ya toleo la awali la chip hii (Atecc508a) inapatikana hapa -> Datasheet Atecc508a

Hatua ya 1: Hatua kwa Hatua

Hatua kwa hatua
Hatua kwa hatua

Katika nakala hii, nitakuonyesha jinsi ya kurekebisha usanidi wa chip hiki na baada ya jinsi ya kusimba data ukitumia AES CBC Algorithme.

Tutafuata hatua hizo:

  1. Ubunifu wa mzunguko
  2. Usanidi wa chip hii
  3. Matumizi ya moduli ya AES CBC
  4. Kwa nini unahitaji kutumia chip hii

Kwa kila hatua, nitakuelezea kila kitu. Pia, niliongeza nambari yangu kwenye Github yangu na maoni kwa kila kazi. Ikiwa una maswali kadhaa juu ya nambari yangu au mradi huu, nitafurahi kuujibu.

Github yangu: Github yangu

Hatua ya 2: Onyo kuhusu Atecc608a

Onyo Kuhusu Atecc608a
Onyo Kuhusu Atecc608a

Chip ya Atecc608a sio chip "rahisi".

Kwanza, nyaraka za chip hii ziko chini ya NDA kwa hivyo huwezi kuipata kamili kwenye mtandao. Lakini hakuna shida kwa hili, data ya toleo la awali inapatikana kwenye Hati ya Mtandao Kamili ATECC508A.

Pili, unapotumia chip hii unahitaji kufunga usanidi wake na haiwezekani kurekebisha usanidi wa chip ikiwa imefungwa. Kwa hivyo kuwa mwangalifu wakati utafunga eneo la Usanidi na eneo la Takwimu.

Tatu, maktaba iliyoandikwa katika C ni kubwa sana na imekamilika, kwa hivyo lazima usome nyaraka za kazi ambazo utatumia hapo awali.

Nne, maktaba iliandika kwa chip hii haifanyi kazi kwa Arduino UNO, lakini Imeongeza kazi zinahitaji kufanya kazi na Arduino UNO.

Chip ATECC608A

Unaweza kuwasiliana na chip hii na I2C. Anwani ya chip hii inaweza kurekebisha katika usanidi.

Chip hii ina nafasi 16 tofauti ambazo zinaweza kuwa na aina tofauti ya data:

  1. Ufunguo wa ECC (ya kibinafsi au ya umma)
  2. Ufunguo wa AES
  3. Takwimu zingine (kama Sha hash au maneno tu)

Kwa upande wetu, tutahifadhi Ufunguo wa AES katika mpangilio mmoja.

Hatua ya 3: 1. Kutamani Mzunguko

1. Hamu ya Mzunguko
1. Hamu ya Mzunguko
1. Hamu ya Mzunguko
1. Hamu ya Mzunguko

1. Ubunifu wa mzunguko

Schema ya mzunguko huu ni rahisi sana!

Unahitaji kutumia nguvu ya 3.3V kwa sababu pendekezo ni kati ya 2.0V na 5.5V lakini nilipendelea kutumia 3.3V.

Kwa chip hii, kawaida unayo nukta kwenye kona ya chip, nukta hii ni Pin 1 ya bodi hii. Niliongeza mtazamo wa Juu wa Atecc608a na Nambari ya PIN kwa sababu ni 8-Lead SOIC kwa hivyo chip ni ndogo sana.

  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)

Unahitaji kutumia nguvu ya 3.3V kwa sababu pendekezo ni kati ya 2.0V na 5.5V lakini nilipendelea kutumia 3.3V.

Niliongeza maoni ya Juu ya Atecc608a kwa sababu ni 8-Lead SOIC kwa hivyo chip ni ndogo sana. Ikiwa ungependa, kwa hivyo wasambazaji huunda bodi na solder ya chip, inaweza kuwa rahisi kwako.

Onyo: Kwa upande wangu, lazima niongeze kipinga kati ya SDA ya Arduino na Chip (pia kwa SDL). Niliongeza kipinga cha 4.7Kohm kwa kila moja.

Hatua ya 4: 2. Usanidi wa Chip (Atecc608a)

Kabla ya kutumia kazi ya usimbuaji fiche au usimbuaji unahitaji kusanidi chip. Katika hatua hii, nitaelezea kila hatua unayohitaji kufanya kwa usanidi wa chip hiki.

Onyo: hatua hii ni kuagiza sana na ikiwa utafunga kanda kabla ya mwisho huwezi kuzirekebisha.

Kama nilivyoelezea hapo awali, chip hii ilipata eneo mbili:

  1. Sanidi Eneo
  2. Eneo la Takwimu

Eneo la usanidi lilipata saizi 128 lakini ka 16 za kwanza haziwezi kubadilishwa.

Ili kusanidi chip hiki, unahitaji mbili zifuate hatua hizo. Ni muhimu kufuata kila hatua kwa mpangilio au usanidi wako hautafanya kazi, na chip yako itafungwa na haiwezi kutumika. Hatua hizo ni:

  1. Unda kiolezo cha usanidi
  2. Andika templeti hii kwa chip
  3. Funga eneo la Usanidi
  4. Andika ufunguo wako wa AES (128 Bits) kwenye slot
  5. Funga eneo la Takwimu

Habari

Hapo chini ninaelezea kila hatua ya ujanibishaji na nambari yangu, lakini hakuna wasiwasi, niliongeza mfano kamili wa usanidi katika Github yangu. Ninaweka maoni juu ya kila kazi, na faili ya *.ino inapatikana kwa kila hatua ili kukufaa.

  • Github yangu: Github yangu
  • Usanidi wa Njia ya Mfano: Configuration_example.ino

Hatua ya kwanza: Unda kiolezo cha usanidi

Kama nilivyoelezea hapo awali, eneo la usanidi linapata saizi ya bits 128, lakini bits 16 za kwanza haziwezi kubadilishwa. Ukanda huu una sehemu nyingi, lakini unahitaji kujua sehemu 3 tu za eneo hili la usanidi wa mradi huu:

  1. Baiti 16 -> Hii ndio anwani ya I2C ya chip
  2. Byte 20 hadi 51 -> Unaweza kurekebisha hapa aina ya Slot kwa nafasi 16 za chip hii
  3. Baiti 96 hadi 127 -> Unaweza kuweka hapa Aina ya ufunguo au data inayotumiwa katika kila nafasi.

(Ikiwa unahitaji ufafanuzi zaidi wa eneo hili lote, tafadhali soma nyaraka (ukurasa 13, kifungu 2.2))

Hapa, niliweka maelezo kila Baiti / Sehemu za ka 112 za usanidi wa Chip. Huu ni mfano, kila chip inayonunuliwa inaweza kuwa na usanidi tofauti:

0xC0, // Anwani ya 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 Seti Slot 4 0x8F, 0x8F, // Yanayopangwa Config Slot 5 0x8F, 0x8F, // Yanayopangwa Config Slot 6 0x9F, 0x8F, // Yanayopangwa Sanidi Slot 7 0x0F, 0x0F, // Yanayopangwa Sanidi Slot 8 0x8F, 0x0F, // Slot Seti Slot 9 0x8F, 0x0F, // Yanayopangwa Config Slot 10 0x8F, 0x0F, // Yanayopangwa Config Slot 11 0x8F, 0x0F, // Yanayopangwa Config Slot 12 0x8F, 0x0F, // Yanayopangwa Config Slot 13 0x00, 0x00, // Yanayopangwa Config Slot 14 0x00, 0x00, // Yanayopangwa Config Slot 15 0xAF, 0x8F, // Yanayopangwa 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, 0x00 0xFF 0x00, 0x00, 0x33, 0x00, // Seti ya Kusanidi Muhimu 1 0x33, 0x00, // Seti ya Usanidi wa Ufunguo 2 0x33, 0x00, // Seti ya Usanidi wa Ufunguo 3 0x1C, 0x00, // Seti ya Ufunguo wa 4 0x1C, 0x00, // Seti ya Usanidi muhimu 5x 1C, 0x00, // Seti ya Usanidi wa Ufunguo 6 0x1C, 0x00, // Sura ya Usanidi Muhimu 7 0x3C, 0x00, // Ufungashaji wa Key Key 8 0x1A, 0x00, // Seti ya Ufunguo 9 0x3A, 0x00, // Seti ya Ufunguo wa 10 0x1A, 0x00, // Seti ya Kusanidi Muhimu 11 0x3A, 0x00, // Seti ya Kusanidi Muhimu 12 0x3A, 0x00, // Seti ya Ufunguo wa 13 13x3C, 0x00, // Seti ya Ufungashaji 14 0x3C, 0x00, // Seti ya Ufunguo wa 15 0x1C, 0x00 // Seti ya Usanidi Muhimu 16

Kama nilivyoona, niliweka maoni katika nambari hii ili kuelewa usanidi huu zaidi.

Katika kesi yako unahitaji kuelewa vitu vitatu tu:

  1. Baiti 16 -> Hii ndio anwani ya I2C ya chip
  2. Byte 20 hadi 51 -> Unaweza kurekebisha hapa aina ya Slot kwa nafasi 16 za chip hii
  3. Byte 96 hadi 127 -> Unaweza kuweka hapa Aina ya ufunguo au data inayotumiwa katika kila nafasi.

Sitaelezea aina ya usanidi na kwanini nilitumia hii na sio nyingine kwa sababu ni ngumu kuelezea kila kitu. Ikiwa unahitaji habari zaidi nenda kwenye nyaraka, ukurasa 16 sehemu ya 2.2.1 ya "SlotConfig" na ukurasa wa 19 sehemu ya 2.2.5 ya "KeyConfig"

Kwa mfano huu, utatumia yanayopangwa 9 kuhifadhi kitufe cha AES.

Kwa hili, tunahitaji kuweka (ikiwa unahitaji, unaweza kunakili mfano hapo juu, marekebisho yamefanywa ndani yake):

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

Kwa nini niliweka usanidi huu: Kwa kila nafasi ya chip hii, unaweza kuweka vigezo vya kusema kwa chip ni aina gani ya data itahifadhiwa. Una vigezo vingi:

  • Yanayopangwa inaweza kuwa kuandika au kusoma (wazi au encrypt hatua)
  • Aina ya data iliyohifadhiwa (Ufunguo wa ECC, Ufunguo wa Umma, SHA Hash, Ufunguo wa AES…)
  • Yanayopangwa inaweza kuwa lockable
  • Uzazi wa ufunguo unaruhusiwa

Na baiti 36 na 37 iliyowekwa "0x0F8F":

  • Takwimu zinaweza kuandikwa katika wazi
  • Yaliyomo kwenye nafasi hii ni ya siri na hayawezi kusomwa
  • Yanayopangwa haiwezi kutumika kwa amri ya CheckMac Copy

Na baiti 112 na 113 iliyowekwa "0x001A":

Slot inaweza kuhifadhi hadi funguo nne za ulinganifu za AES 128-bit (KeyType = 0x6)

Hatua ya pili: Andika usanidi huu

Hatua hii ni muhimu sana kwa sababu tutaweka chip na usanidi wetu na ikiwa usanidi huu sio mzuri, utatumia chip hii.

Lakini hakuna wasiwasi, mradi Usanidi haujafungwa, unaweza kurekebisha usanidi wako.

Hapa, nambari hii inayotumika kuandika usanidi kwa chip:

/ ** / kifupi Andika usanidi mpya kwa chip.

* / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [in] config Sanifu uint8_t ya usanidi (urefu wa 112) * / param [in] len Ukubwa wa safu ya usanidi * / kurudi ATCA_SUCCESS juu ya mafanikio, vinginevyo nambari ya makosa. * / ATCA_STATUS write_configuration (ATCAIfaceCfg * cfg, uint8_t * config, size_t len) {if (len! = 112) kurudi ATCA_BAD_PARAM; Hadhi ya ATCA_STATUS; hadhi = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {// Andika usanidi wa Mpangilio wa chip // Padding ya 16 byte (ka 16 za kwanza haziwezi kufutwa) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); hali ya kurudi; } hali ya kurudi; }

Kazi hii itaandika usanidi wako kwenye chip.

Hatua ya tatu: funga eneo la usanidi

Onyo: kuwa mwangalifu na hatua hii, ikiwa utafunga Ukanda huu na usanidi wako sio mzuri, chip haiwezi kutumika na haungeweza kurekebisha ukanda huu

Kwa kitendo hiki, tutatumia kazi hii:

/ ** / kifupi Angalia ikiwa DATA_ZONE au CONFIG_ZONE imefungwa

* / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [katika] eneo LOCK_ZONE_DATA au LOCK_ZONE_CONFIG * / kurudi ATCA_SUCCESS juu ya mafanikio, vinginevyo nambari ya makosa. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, uint8_t zone) {ATCA_STATUS hadhi; kufuli bool = uwongo; ikiwa (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) kurudi ATCA_BAD_PARAM; hadhi = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {ikiwa (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock))) {kurudi ATCA_FUNC_FAIL; } ikiwa (! funga) {kurudi ATCA_NOT_LOCKED; } kurudi ATCA_SUCCESS; } kurudi ATCA_BAD_PARAM; } angalia_za_zone (& cfg, LOCK_ZONE_CONFIG);

Hatua ya nne: Andika AES muhimu katika yanayopangwa

Katika sehemu hii utaweka kitufe cha kibinafsi cha AES kwenye nafasi ambayo umeelezea katika usanidi wa chip.

Kwa mfano huu, nitatumia nambari ya yanayopangwa 9 ya chip.

Unahitaji kujua: Kipengele maalum cha chip hiki unaweza kuandika data kwenye slot tu kwa ka 4 au ka 32. Kwa AES tunahitaji bits 128 muhimu kwa hivyo ka 16 za data. Kwa hivyo niliamua kuandika kwa ufunguo wa ka 16 kila moja kwenye hii slot kuwa na data 32 za ka.

Sasa, nitakuonyesha nambari iliyotumiwa:

/ ** / kifupi Andika kitufe cha AES katika nafasi uliyopewa. * / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [katika] nambari muhimu ya nafasi inayopangwa vinginevyo msimbo wa kosa. * / ATCA_STATUS write_key_slot (ATCAIfaceCfg * cfg, uint8_t ufunguo, uint8_t * datakey, size_t len) {ikiwa (ufunguo 16) kurudi ATCA_BAD_PARAM; ikiwa (len! = 32) kurudi ATCA_BAD_PARAM; Hali ya ATCA_STATUS = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) ufunguo, 0, 0, datakey, 32); ikiwa (hadhi! = ATCA_SUCCESS) hali ya kurudi; } hali ya kurudi; }

Kwa mfano huu, nitatumia Funguo mbili za AES za ka 16 kila moja:

// Mfano wa AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; andika_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Ikiwa hatua hii ni nzuri, sasa, lazima upitishe hatua ya mwisho "funga eneo la data"

Hatua ya mwisho: funga eneo la Takwimu

Onyo: kuwa mwangalifu na hatua hii, ikiwa utafunga Ukanda huu na data yako haijawekwa, chip haiwezi kutumika na haungeweza kurekebisha ukanda huu

Kwa kitendo hiki, tutatumia kazi hii:

/ ** / kifupi Angalia ikiwa DATA_ZONE au CONFIG_ZONE imefungwa

* / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [katika] eneo LOCK_ZONE_DATA au LOCK_ZONE_CONFIG * / kurudi ATCA_SUCCESS juu ya mafanikio, vinginevyo nambari ya makosa. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, uint8_t zone) {ATCA_STATUS hadhi; kufuli bool = uwongo; ikiwa (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) kurudi ATCA_BAD_PARAM; hadhi = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {ikiwa (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock))) {kurudi ATCA_FUNC_FAIL; } ikiwa (! funga) {kurudi ATCA_NOT_LOCKED; } kurudi ATCA_SUCCESS; } kurudi ATCA_BAD_PARAM; } angalia_za_zone (& cfg, LOCK_ZONE_DATA);

Ikiwa hatua hii ni nzuri, chip yako iko tayari kutumika

Hatua ya 5: 3. Matumizi ya Moduli ya AES CBC

3. Utumiaji wa Moduli ya AES CBC
3. Utumiaji wa Moduli ya AES CBC

Nitaelezea jinsi ya kusimba na kusimbua data na algorithm AES CBC na chip Atecc608a.

Kumbuka: Kabla ya kutumia kazi hii, unahitaji kuanzisha chip. Kwa hili, fuata hatua ya 2 ya nakala hii

Chip hiki kilipata aina nyingi za moduli ya AES (bits AES 128), ni bits AES 128 tu zinazowezekana:

  1. AES kawaida
  2. AES CBC
  3. AES GCM (na GFM hash) (angalia wikipedia kwa ufafanuzi zaidi)

Ili kuifanya iwe rahisi kutumia, niliunda kazi mbili:

  1. aes_cbc_encrypt
  2. aes_cbc_drypt

Kazi hizo mbili zinapatikana kwenye Github yangu.

Ufafanuzi

Ninachagua kutumia Algorithm ya AES CBC kwa sababu ni salama kuliko msingi wa AES 128 bits. Algorithm hii hutumia Vector ya Awali kusimba data yako.

Habari

Hapo chini ninaelezea kila hatua ya njia fiche na usimbuaji. Lakini niliandika nambari ya Arduino inayotumia kazi hizo mbili. Unaweza kuona nambari hii katika Github yangu:

  • Github: Github yangu
  • Mfano wa nambari "Encrypt / Decrypt": AES_crypto_example.ino

Hatua ya kwanza: Ficha data yako kwa njia fiche

Katika sehemu hii, nitakuonyesha jinsi ya kusimba data yako.

Kwanza utahitaji kazi hii:

/ ** / fupisha fiche data kwa kutumia algorithme ya AES CBC * / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [katika] data Maneno ya kusimba (lazima igawanywe na 16, upeo wa urefu wa 240) * / param [katika] len urefu wa Maneno ya kusimba (lazima igawanywe na 16, urefu wa juu 240) * / param [nje] iv Vector ya awali iliyotumiwa katika AES CBC (rudisha vector katika hii var) * / param [nje] maandishi yanarudi hapa maandishi ya Kipre * ufunguo * / kurudi ATCA_SUCCESS juu ya mafanikio, vinginevyo nambari ya makosa. * / ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg * cfg, data uint8_t *, int len, uint8_t * iv, uint8_t * ciphertext, ufunguo wa u8) {atca_aes_cbc_ctx_t ctx; ikiwa (len> LIMIT_DATA_SIZE_CBC && len% 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); kurudi ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; Hali ya ATCA_STATUS = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); ikiwa (hadhi! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (hadhi, HEX); kurudi; } kumbukumbu (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; kwa (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & ciphertext [j * 16]); } ikiwa (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Error Error 0x")); Serial.println (hadhi, HEX); } hali ya kurudi; } hali ya kurudi; }

Kazi hii ni rahisi kutumia, lazima uweke vitu viwili:

  1. IV tupu (Vector ya Awali) ya 16 Baiti
  2. Takwimu fiche (saizi kubwa max 240 Baiti)

Hapa kuna mfano "jinsi ya kutumia kazi hii".

Ninataka kusimba neno "AAAAAAAAAAAAAAAA", na ufunguo wangu umeandikwa kwenye nambari ya "9":

Hali ya ATCA_STATUS = atcab_init (& cfg); ikiwa (hadhi! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () imeshindwa: Msimbo -> 0x")); Serial.println (hadhi, HEX); } uint8_t maandishi makali [16] = "AAAAAAAAAAAAAAAA"; // Nakala asilia uint8_t iv [IV_LENGTH_CBC]; // Vector ya awali uint8_t cypherdata [sizeof (maandishi wazi)]; // Hali iliyosimbwa kwa data = aes_cbc_encrypt (& cfg, maandishi wazi, saizi ya (maandishi ya maandishi), iv, cypherdata, 9);

Ikiwa hatua ni nzuri, utakuwa na data iliyosimbwa katika "cypherdata" inayobadilika na Vector ya Awali katika "IV" inayobadilika.

Weka vigeuzi hivi viwili kusimbua maandishi yako!

Hatua ya pili: ficha data yako

Kusimbua data yako utahitaji vitu viwili:

  1. Vector ya Awali
  2. Takwimu za Cypher (data iliyosimbwa kwa njia fiche)

Kusimbua data yako, utahitaji kazi hii:

/ ** / Fupisha data fiche kutumia AES CBC algorithme * / param [in] cfg Usanidi wa kiolesura cha kimantiki. Baadhi ya usanidi uliofafanuliwa * unaweza kupatikana katika atca_cfgs.h * / param [katika] maandishi ya maandishi Maneno ya kusimbua (lazima igawanywe na 16, upeo wa urefu wa 240) * / param [katika] len urefu wa Maneno ya kubatilisha (lazima igawanywe na 16, urefu wa juu 240) * / param [in] iv Vector ya awali ya kutumia katika AES CBC * / param [nje] maandishi ya maandishi kurudi hapa maandishi yaliyosimbwa * / param [katika] Nambari muhimu ya Slot ya ufunguo * / kurudi ATCA_SUCCESS juu ya mafanikio, vinginevyo nambari ya makosa. * / ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg * cfg, uint8_t * ciphertext, int len, uint8_t * iv, uint8_t * maandishi ya maandishi, ufunguo wa u8) t {atca_aes_cbc_ctx_t ctx; ikiwa (len> LIMIT_DATA_SIZE_CBC || len% 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); kurudi ATCA_BAD_PARAM; } Hadhi ya ATCA_STATUS = atcab_init (cfg); ikiwa (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, ufunguo, 0, iv); ikiwa (hadhi! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (hadhi, HEX); kurudi; } int max = len / 16; kwa (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & plaintext [j * 16]); } ikiwa (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Error Error 0x")); Serial.println (hadhi, HEX); } hali ya kurudi; } hali ya kurudi; }

Ninataka kufuta data yangu ya awali (angalia hapa chini, hatua ya Kwanza). Kwa hili nitafanya hivi:

uint8_t maandishi makali [16] = "AAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (maandishi ya wazi)]; uint8_t decryptdata [sizeof (maandishi ya wazi)]; hadhi = aes_cbc_decrypt (& cfg, cypherdata, saizi ya (cypherdata), iv, decryptdata, 9); ikiwa (status == ATCA_SUCCESS) {Serial.print ("Nakala iliyosimbwa ni:"); kwa (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } mwingine {// Tazama faili atca_status.h kwa Kosa la Msimbo Serial.print (F ("Haiwezekani kufanya usimbuaji | Kosa la Msimbo 0x")); Serial.println (hadhi, HEX); kurudi; }

Ikiwa kitendo ni kizuri, utakuwa na data iliyosimbwa katika "decryptdata" inayobadilika.

Sasa unajua jinsi ya kutumia usimbuaji fiche na usimbuaji na Chip Atecc608a

Hatua ya 6: 5. Kwa nini unahitaji kutumia Chip hii

Data iliyosimbwa kwa njia fiche ni muhimu sana kwa sababu unaweza kuficha habari yako na kuituma kwa Wireless au kuihifadhi tu.

Hapa kuna mfano wa matumizi:

  1. Takwimu zilizohifadhiwa kwa EEPROM ya nje: Unaweza kupata data ya EEPROM ya nje na ikiwa mtu bado ana EEPROM hii, atahitaji Ufunguo na IV kwa usimbuaji
  2. Tuma data isiyo na waya: Unaweza kutuma data hii iliyosimbwa kwa njia isiyo na waya (nrf24L01, RFM95W…) na ikiwa mtu atazuia data yako, data hii itakuwa salama
  3. Nenosiri lililohifadhiwa

Unaweza kufanya vitu vingi na chip hii. Inaweza kutumika katika mradi anuwai. Ikiwa una muda, niambie utatumia chip hiki kwa mradi gani?

Ushauri mmoja wa mwisho, ikiwa utaunda mradi wowote wa waya au kuhifadhi data ghafi, kuwa mwangalifu, usalama ni muhimu sana na ikiwa unajua jinsi ilivyo rahisi kwa "noob" kukatiza au kuiba data yako. Sasa na Mtandaoni, kila mtu anaweza kuwa na hati za kuzindua kwenye kompyuta yake ili "kukutapeli"!

Hatua ya 7: Hitimisho

Natumaini nakala hii itakuwa muhimu kwako. Samahani ikiwa nilikosea katika maandishi yangu lakini Kiingereza sio lugha yangu kuu na ninazungumza vizuri kuliko ninavyoandika.

Asante kwa kusoma kila kitu.

Furahia.

Ilipendekeza: