Isi kandungan:

Keselamatan Dengan Arduino: Atecc608a: 7 Langkah
Keselamatan Dengan Arduino: Atecc608a: 7 Langkah

Video: Keselamatan Dengan Arduino: Atecc608a: 7 Langkah

Video: Keselamatan Dengan Arduino: Atecc608a: 7 Langkah
Video: Smart Home Security System using Arduino | Proteus Simulation 2024, Julai
Anonim
Keselamatan Dengan Arduino: Atecc608a
Keselamatan Dengan Arduino: Atecc608a
Keselamatan Dengan Arduino: Atecc608a
Keselamatan Dengan Arduino: Atecc608a

Topik

Hai semua !

Ini adalah Artikel Instructables pertama saya jadi saya harap ia akan menarik bagi anda semua.

Dalam artikel ini, saya akan menerangkan kepada anda bagaimana menggunakan cip mikro yang disebut "ATECC608A" yang menyediakan pelbagai alat keselamatan.

Cip ini telah direka oleh MicroChip dan ia adalah versi terakhir "cip CryptoAuthentication". Sebelum versi ini, terdapat "ATSHA204A" dan "ATECC508A".

Mengapa saya memutuskan untuk menggunakan versi terakhir dan bukan versi sebelumnya?

Versi ini adalah cip paling maju dan mempunyai fungsi yang tidak dimiliki versi lama (Contohnya: modul AES, modul perlindungan IO…).

Mengapa projek ini?

Saya bekerja di domain CyberSecurity dan sebagai semua orang yang saya gemari pengaturcaraan dan elektronik. Semasa belajar, saya mengadakan persidangan dengan pakar mengenai IoT Security yang menunjukkan kepada kami bahawa Industrial tidak menggunakan Security dalam objek IoT mereka. Saya menunjukkan padlock yang boleh dibuka dengan telefon pintar anda melalui Bluetooth. Pada gembok, satu kalimat mengatakan "Gembok ini paling selamat daripada kunci kunci!". Kalimat ini membuatnya tersenyum dan dia mengubah kalimat "Gembok ini adalah gembok terburuk yang pernah dibina!".

Dia menunjukkan kepada kami dengan PC sendiri dan sniffer Bluetooth bahawa setiap arahan yang dihantar oleh telefon pintar adalah sama setiap kali dan sangat mudah untuk menyalin perintah ini dan mengirimkannya dengan telefon pintar anda. Dia menjelaskan kepada kita bahawa "Keselamatan" untuk "Industri" bukanlah masalah utama. Dia menunjukkan kepada kami cip (kurang dari 0,60 $) yang dapat menambahkan lapisan keamanan pada benda-benda ini.

Selepas demonstrasi ini, saya cuba mencari beberapa projek sumber terbuka yang menambahkan lapisan keselamatan pada objek IoT tetapi saya tidak pernah menjumpainya.

Oleh itu, saya memutuskan untuk mengerjakan projek yang menggunakan lapisan keselamatan untuk komunikasi antara dua objek IoT.

Apa idea saya?

Semasa komunikasi antara dua Objek IoT, terdapat banyak serangan: Man Of the ringan, Salinan maklumat dan banyak lagi.. Jadi idea saya sangat mudah:

  1. Penggunaan data yang dienkripsi antara dua atau lebih objek IoT.
  2. Bekalan kos rendah
  3. Boleh bekerjasama dengan Arduino UNO

Sekarang saya akan menerangkan kepada anda bagaimana saya melaksanakan gambar abstrak ini dengan cip Arduino dan Atecc608a. Dalam artikel ini, saya akan menerangkan cara menggunakan Arduino UNO dengan ATECC608A.

Saya akan menulis artikel mengenai komunikasi dua objek lain kali.

Bekalan

Anda memerlukan beberapa perkara untuk projek ini:

  1. Arduino UNO atau MEGA (Chip mestilah Atmega 328 atau ATMEGA 2560)
  2. Cip Atecc608A (berharga kurang dari 0.80 $ setiap satu, senang didapati di laman web pembekal anda)
  3. Penyesuai SOIC 8-Pin
  4. Beberapa wayar dan perintang

Lembar data versi sebelumnya dari cip ini (Atecc508a) boleh didapati di sini -> Datasheet Atecc508a

Langkah 1: Langkah demi Langkah

Langkah demi langkah
Langkah demi langkah

Dalam artikel ini, saya akan menunjukkan kepada anda cara mengubah suai konfigurasi cip ini dan selepas bagaimana menyulitkan data menggunakan AES CBC Algorithme.

Kami akan mengikuti langkah-langkah tersebut:

  1. Reka bentuk litar
  2. Konfigurasi cip ini
  3. Penggunaan modul AES CBC
  4. Mengapa anda perlu menggunakan cip ini

Untuk setiap langkah, saya akan memperincikan semuanya untuk anda. Juga, saya menambahkan kod saya di Github saya dengan komen untuk setiap fungsi. Sekiranya anda mempunyai beberapa soalan mengenai kod saya atau projek ini, saya dengan senang hati akan menjawabnya.

Github saya: Github saya

Langkah 2: Amaran Mengenai Atecc608a

Amaran Mengenai Atecc608a
Amaran Mengenai Atecc608a

Cip Atecc608a bukan cip "mudah".

Pertama, dokumentasi cip ini ada di bawah NDA sehingga anda tidak akan dapat mencarinya dengan lengkap di Internet. Tetapi tidak ada masalah untuk ini, lembar data versi sebelumnya tersedia di Internet Datasheet Complete ATECC508A.

Kedua, apabila anda menggunakan cip ini, anda perlu mengunci konfigurasi dan mustahil untuk mengubah konfigurasi cip jika terkunci. Oleh itu, berhati-hatilah ketika anda akan mengunci Config Zone dan Data Zone.

Ketiga, perpustakaan yang ditulis dalam C sangat besar dan lengkap, jadi anda harus membaca dokumentasi fungsi yang akan anda gunakan sebelumnya.

Empat, perpustakaan menulis bahawa cip ini tidak berfungsi untuk Arduino UNO, tetapi ia menambahkan fungsi yang diperlukan untuk bekerja dengan Arduino UNO.

Cip ATECC608A

Anda boleh berkomunikasi dengan cip ini melalui I2C. Alamat cip ini dapat diubah dalam konfigurasi.

Cip ini mengandungi 16 slot berbeza yang boleh mengandungi pelbagai jenis data:

  1. Kunci ECC (peribadi atau awam)
  2. Kunci AES
  3. Data lain (seperti Sha hash atau hanya perkataan)

Dalam kes kami, kami akan menyimpan AES Key dalam satu slot.

Langkah 3: 1. Desing Litar

1. Desing Litar
1. Desing Litar
1. Desing Litar
1. Desing Litar

1. Reka bentuk litar

Skema litar ini sangat mudah!

Anda perlu menggunakan kuasa 3.3V kerana cadangannya antara 2.0V dan 5.5V tetapi saya lebih suka menggunakan 3.3V.

Untuk cip ini, biasanya anda mempunyai titik di sudut cip, titik ini adalah Pin 1 dari papan ini. Saya menambah paparan Atecc608a Atas dengan Nombor PIN kerana ia adalah SOIC 8-Lead sehingga cipnya sangat kecil.

  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)

Anda perlu menggunakan kuasa 3.3V kerana cadangannya antara 2.0V dan 5.5V tetapi saya lebih suka menggunakan 3.3V.

Saya menambah paparan Atecc608a Atas kerana ia adalah SOIC 8-Lead sehingga cipnya sangat kecil. Sekiranya anda suka, jadi pembekal membina beberapa papan dengan solder cip, mungkin lebih mudah bagi anda.

Amaran: Dalam kes saya, saya perlu menambahkan perintang antara SDA Arduino dan Chip (juga untuk SDL). Saya menambah perintang 4.7Kohm untuk masing-masing.

Langkah 4: 2. Konfigurasi Chip (Atecc608a)

Sebelum menggunakan fungsi penyulitan atau penyahsulitan anda perlu mengkonfigurasi cip. Pada langkah ini, saya akan memperincikan setiap langkah yang perlu anda lakukan untuk konfigurasi cip ini.

Amaran: langkah ini sangat penting dan jika anda mengunci zon sebelum akhir anda tidak dapat mengubahnya.

Seperti yang dijelaskan sebelumnya, cip ini mendapat dua zon:

  1. Zon Konfigurasi
  2. Zon Data

Zon konfigurasi mendapat ukuran 128 bait tetapi 16 bait pertama tidak dapat diubah.

Untuk mengkonfigurasi cip ini, anda memerlukan dua ikuti langkah tersebut. Sangat penting untuk mengikuti setiap langkah agar konfigurasi anda tidak berfungsi, dan cip anda akan terkunci dan tidak dapat digunakan. Langkah-langkah tersebut adalah:

  1. Buat templat konfigurasi
  2. Tulis templat ini ke cip
  3. Kunci Zon Konfigurasi
  4. Tuliskan Kunci AES anda (128 Bits) dalam slot
  5. Kunci Zon Data

Maklumat

Di bawah ini saya memperincikan setiap langkah konfigurasi dengan kod saya, tetapi jangan risau, saya menambahkan contoh konfigurasi penuh di Github saya. Saya memberikan komen pada setiap fungsi, dan fail *.ino tersedia dengan setiap langkah untuk anda.

  • Github saya: Github saya
  • Laluan Contoh Konfigurasi: config_example.ino

Langkah pertama: Buat templat konfigurasi

Seperti yang dijelaskan sebelumnya, zon konfigurasi mendapat ukuran 128 bit, tetapi 16 bit pertama tidak dapat diubah. Zon ini terdiri daripada beberapa bahagian, tetapi anda hanya perlu mengetahui 3 bahagian zon konfigurasi ini untuk projek ini:

  1. The Bytes 16 -> Ini adalah alamat I2C cip
  2. Bytes 20 hingga 51 -> Anda boleh mengubah suai di sini jenis Slot untuk 16 slot cip ini
  3. Bytes 96 hingga 127 -> Anda boleh menetapkan di sini Jenis kunci atau data yang digunakan di setiap slot.

(Sekiranya anda memerlukan penjelasan lebih lanjut mengenai semua zon ini, baca dokumentasi (halaman 13, bahagian 2.2))

Di sini, saya memasukkan perincian setiap Byte / Bahagian 112 bait konfigurasi Chip. Ini adalah contoh, setiap cip yang dibeli boleh mempunyai konfigurasi yang berbeza:

0xC0, // alamat I2C

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config Slot 1 0x85, 0x20, // Slot Config Slot 2 0x8F, 0x20, // Slot Config Slot 3 0xC4, 0x8F, // Slot Config Slot 4 0x8F, 0x8F, // Slot Config Slot 5 0x8F, 0x8F, // Slot Config Slot 6 0x9F, 0x8F, // Slot Config Slot 7 0x0F, 0x0F, // Slot Config Slot 8 0x8F, 0x0F, // Slot Config Slot 9 0x8F, 0x0F, // Slot Config Slot 10 0x8F, 0x0F, // Slot Config Slot 11 0x8F, 0x0F, // Slot Config Slot 12 0x8F, 0x0F, // Slot Config Slot 13 0x00, 0x00, // Slot Config Slot 14 0x00, 0x00, // Slot Config Slot 15 0xAF, 0x8F, // Slot Config Slot 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Slot Config Key 1 0x33, 0x00, // Slot Config Key 2 0x33, 0x00, // Slot Config Kunci 3 0x1C, 0x00, // Slot Config Kunci 4 0x1C, 0x00, // Slot Konfigurasi Kunci 5 0x 1C, 0x00, // Slot Konfigurasi Kunci 6 0x1C, 0x00, // Slot Konfigurasi Kunci 7 0x3C, 0x00, // Slot Konfigurasi Kunci 8 0x1A, 0x00, // Slot Konfigurasi Kunci 9 0x3A, 0x00, // Slot Konfigurasi Kunci 10 0x1A, 0x00, // Slot Konfigurasi Kunci 11 0x3A, 0x00, // Slot Konfigurasi Kunci 12 0x3A, 0x00, // Slot Konfigurasi Kunci 13 0x3C, 0x00, // Slot Konfigurasi Kunci 14 0x3C, 0x00, // Slot Konfigurasi Kunci 15 0x1C, 0x00 // Slot Konfigurasi Kunci 16

Seperti yang saya lihat, saya meletakkan beberapa komen dalam kod ini untuk memahami lebih banyak konfigurasi ini.

Sekiranya anda hanya perlu memahami tiga perkara:

  1. The Bytes 16 -> Ini adalah alamat I2C cip
  2. Bytes 20 hingga 51 -> Anda boleh mengubah suai di sini jenis Slot untuk 16 slot cip ini
  3. Byte 96 hingga 127 -> Anda boleh menetapkan di sini Jenis kunci atau data yang digunakan di setiap slot.

Saya tidak akan menerangkan jenis konfigurasi dan mengapa saya menggunakannya dan bukan yang lain kerana sukar untuk menjelaskan semuanya. Sekiranya anda memerlukan lebih banyak maklumat, pergi ke dokumentasi, halaman 16 bahagian 2.2.1 untuk "SlotConfig" dan halaman 19 bahagian 2.2.5 untuk "KeyConfig"

Untuk contoh ini, anda akan menggunakan slot 9 untuk menyimpan kunci AES.

Untuk ini, kita perlu meletakkan (jika anda memerlukan, anda boleh menyalin contoh di atas, pengubahsuaian telah dilakukan di dalamnya):

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

Mengapa saya menetapkan konfigurasi ini: Untuk setiap slot cip ini, anda boleh menetapkan parameter untuk mengatakan kepada cip jenis data apa yang akan disimpan. Anda mempunyai pelbagai parameter:

  • Slot boleh ditulis atau dibaca (tindakan yang jelas atau disulitkan)
  • Jenis data yang disimpan (kunci ECC, Kunci Awam, SHA Hash, Kunci AES…)
  • Slot boleh dikunci
  • Penjanaan kunci dibenarkan

Dengan bait 36 dan 37 ditetapkan ke "0x0F8F":

  • Data boleh ditulis di Clear
  • Kandungan slot ini rahsia dan tidak dapat dibaca
  • Slot tidak dapat digunakan untuk perintah CheckMac Copy

Dengan bait 112 dan 113 ditetapkan ke "0x001A":

Slot boleh menyimpan sehingga empat kunci simetri AES 128-bit (Jenis Kunci = 0x6)

Langkah kedua: Tulis konfigurasi ini

Langkah ini sangat penting kerana kami akan menetapkan cip dengan konfigurasi kami dan jika konfigurasi ini tidak baik, anda akan menggunakan cip ini.

Tetapi jangan risau, selagi Konfigurasi tidak dikunci, anda boleh mengubah konfigurasi anda.

Di sini, kod ini digunakan untuk menulis konfigurasi ke cip:

/ ** / ringkas Tulis konfigurasi baru ke cip.

* / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi yang telah ditentukan * boleh didapati di atca_cfgs.h * / param [in] config Array uint8_t konfigurasi (panjang 112) * / param [in] len Saiz susunan konfigurasi * / mengembalikan ATCA_SUCCESS pada kejayaan, jika tidak, kod ralat. * / ATCA_STATUS write_configuration (ATCAIfaceCfg * cfg, uint8_t * config, size_t len) {if (len! = 112) kembalikan ATCA_BAD_PARAM; Status ATCA_STATUS; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Tulis konfigurasi Array to the chip // Padding 16 byte (16 byte pertama tidak boleh ditulis) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); status pemulangan; } status kembali; }

Fungsi ini akan menulis konfigurasi anda dalam cip.

Langkah ketiga: kunci konfigurasi Zon

Peringatan: berhati-hati dengan langkah ini, jika anda mengunci Zon ini dan konfigurasi anda tidak baik, cip tidak dapat digunakan dan anda tidak dapat mengubah zon ini

Untuk tindakan ini, kami akan menggunakan fungsi ini:

/ ** / ringkas Periksa sama ada DATA_ZONE atau CONFIG_ZONE terkunci

* / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi * yang telah ditentukan boleh didapati di atca_cfgs.h * / param [in] zon LOCK_ZONE_DATA atau LOCK_ZONE_CONFIG * / mengembalikan ATCA_SUCCESS pada kejayaan, jika tidak, kod ralat. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, zona uint8_t) {status ATCA_STATUS; kunci bool = salah; jika (zon! = (uint8_t) LOCK_ZONE_CONFIG && zon! = (uint8_t) LOCK_ZONE_DATA) kembalikan ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zon, & kunci))) {kembali ATCA_FUNC_FAIL; } jika (! kunci) {kembali ATCA_NOT_LOCKED; } kembali ATCA_SUCCESS; } kembali ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Langkah keempat: Tuliskan anda AES Key dalam slot

Di bahagian ini anda akan menetapkan kunci AES peribadi anda dalam slot yang telah anda tentukan dalam konfigurasi cip.

Untuk contoh ini, saya akan menggunakan slot nombor 9 cip.

Anda perlu tahu: Ciri khas cip ini ialah anda dapat menulis data dalam slot hanya dengan 4 bait atau 32 bait. Untuk AES, kami memerlukan Kunci 128 bit sehingga 16 bait data. Oleh itu, saya memutuskan untuk menulis kepada 16 bait masing-masing dalam slot ini untuk mempunyai data 32 bait.

Sekarang, saya akan menunjukkan kepada anda kod yang digunakan:

/ ** / ringkas Tulis kekunci AES dalam slot yang diberikan. * / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi * yang telah ditentukan boleh didapati di atca_cfgs.h * / param [in] nombor slot kunci utama * / param [in] array kunci datakey uint8_t * / param [in] len Saiz susunan kunci * / kembali ATCA_SUCCESS pada kejayaan, jika tidak, kod ralat. * / ATCA_STATUS write_key_slot (ATCAIfaceCfg * cfg, uint8_t key, uint8_t * datakey, size_t len) {jika (kunci 16) kembali ATCA_BAD_PARAM; jika (len! = 32) kembalikan ATCA_BAD_PARAM; Status ATCA_STATUS = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) kunci, 0, 0, datakey, 32); jika (status! = ATCA_SUCCESS) mengembalikan status; } status kembali; }

Untuk contoh ini, saya akan menggunakan dua Kekunci AES masing-masing 16 bait:

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

Sekiranya tindakan ini baik, sekarang, anda harus melalui langkah terakhir "kunci zon data"

Langkah terakhir: kunci Zon Data

Peringatan: berhati-hatilah dengan langkah ini, jika anda mengunci Zon ini dan data anda tidak diset, cip tidak dapat digunakan dan anda tidak dapat mengubah zon ini

Untuk tindakan ini, kami akan menggunakan fungsi ini:

/ ** / ringkas Periksa sama ada DATA_ZONE atau CONFIG_ZONE terkunci

* / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi * yang telah ditentukan boleh didapati di atca_cfgs.h * / param [in] zon LOCK_ZONE_DATA atau LOCK_ZONE_CONFIG * / mengembalikan ATCA_SUCCESS pada kejayaan, jika tidak, kod ralat. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, zon uint8_t) {status ATCA_STATUS; kunci bool = salah; jika (zon! = (uint8_t) LOCK_ZONE_CONFIG && zon! = (uint8_t) LOCK_ZONE_DATA) kembalikan ATCA_BAD_PARAM; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zon, & kunci))) {kembali ATCA_FUNC_FAIL; } jika (! kunci) {kembali ATCA_NOT_LOCKED; } kembali ATCA_SUCCESS; } kembali ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Sekiranya tindakan ini baik, cip anda siap digunakan

Langkah 5: 3. Penggunaan Modul CBC AES

3. Penggunaan Modul CBC AES
3. Penggunaan Modul CBC AES

Saya akan menerangkan cara menyulitkan dan menyahsulitkan data dengan algoritma AES CBC dan cip Atecc608a.

Ingat: Sebelum menggunakan fungsi ini, anda perlu menyiapkan cipnya. Untuk ini, ikuti langkah 2 artikel ini

Cip ini mendapat pelbagai jenis modul AES (AES 128 bit), hanya AES 128 bit yang mungkin:

  1. AES biasa
  2. AES CBC
  3. AES GCM (dengan hash GFM) (lihat wikipedia untuk penjelasan lebih lanjut)

Untuk menjadikannya lebih mudah digunakan, saya membuat dua fungsi:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Kedua-dua fungsi tersebut terdapat di Github saya.

Penjelasan

Saya memilih untuk menggunakan Algoritma AES CBC kerana ia lebih selamat daripada AES 128 bit asas. Algoritma ini menggunakan Vektor Awal untuk menyulitkan data anda.

Maklumat

Di bawah ini saya perincikan setiap langkah kaedah penyulitan dan penyahsulitan. Tetapi saya menulis kod untuk Arduino yang menggunakan kedua fungsi tersebut. Anda dapat melihat kod ini di Github saya:

  • Github: Github saya
  • Contoh kod "Encrypt / Decrypt": AES_crypto_example.ino

Langkah pertama: Enkripsi data anda

Di bahagian ini, saya akan menunjukkan kepada anda cara menyulitkan data anda.

Mula-mula anda memerlukan fungsi ini:

/ ** / Encrypt data ringkas menggunakan algoritma AES CBC * / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi yang telah ditentukan * boleh didapati di data atca_cfgs.h * / param [in] Words to encypt (mesti dibahagi dengan 16, panjang maksimum 240) * / param [in] panjang Words to encypt (mesti dibahagi dengan 16, panjang maksimum 240) * / param [out] iv Vektor Awal yang digunakan di CBP AES (kembalikan vektor dalam var ini) * / param [out] ciphertext kembali ke sini teks Cypher * / param [in] nombor Slot kunci * / mengembalikan ATCA_SUCCESS pada kejayaan, jika tidak, kod ralat. * / ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg * cfg, uint8_t * data, int len, uint8_t * iv, uint8_t * ciphertext, kunci uint8_t) {atca_aes_cbc_ctx_t ctx; jika (len> LIMIT_DATA_SIZE_CBC && len% 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); kembali ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; Status ATCA_STATUS = atcab_init (cfg); jika (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, kunci, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Ralat Kod 0x")); Serial.println (status, HEX); kembali; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; untuk (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & ciphertext [j * 16]); } jika (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (status, HEX); } status kembali; } status kembali; }

Fungsi ini mudah digunakan, anda harus menetapkan dua perkara:

  1. IV kosong (Vektor Awal) 16 Bait
  2. Data untuk disulitkan (saiz maksimum 240 Byte)

Berikut adalah contoh "bagaimana menggunakan fungsi ini".

Saya mahu mengenkripsi perkataan "AAAAAAAAAAAAAAA", dengan kunci saya ditulis dalam nombor slot "9":

Status ATCA_STATUS = atcab_init (& cfg); jika (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () gagal: Kod -> 0x")); Serial.println (status, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Teks asal uint8_t iv [IV_LENGTH_CBC]; // Vektor Awal uint8_t cypherdata [sizeof (plaintext)]; // Status yang disulitkan data = aes_cbc_encrypt (& cfg, plaintext, sizeof (plaintext), iv, cypherdata, 9);

Sekiranya tindakannya baik, anda akan mempunyai data yang dienkripsi dalam pemboleh ubah "cypherdata" dan Vektor Awal dalam pemboleh ubah "IV".

Simpan kedua pemboleh ubah tersebut untuk mendekripsi teks anda!

Langkah kedua: nyahsulitkan data anda

Untuk menyahsulitkan data anda, anda memerlukan dua perkara:

  1. Vektor Awal
  2. Data Cypher (data yang disulitkan)

Untuk menyahsulitkan data anda, anda memerlukan fungsi ini:

/ ** / Decrypt data ringkas menggunakan algoritma AES CBC * / param [in] cfg Konfigurasi antara muka logik. Beberapa konfigurasi yang telah ditentukan * boleh didapati di atca_cfgs.h * / param [in] ciphertext Words to decypt (mesti dibahagi dengan 16, panjang maksimum 240) * / param [in] panjang Words untuk decypt (mesti dibahagi dengan 16, panjang maksimum 240) * / param [in] iv Vektor Awal yang akan digunakan dalam AES CBC * / param [out] plaintext kembali ke sini teks yang didekripsi * / param [in] kunci Slot nombor kunci * / return ATCA_SUCCESS atas kejayaan, jika tidak, kod ralat. * / ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg * cfg, uint8_t * ciphertext, int len, uint8_t * iv, uint8_t * plaintext, kunci uint8_t) {atca_aes_cbc_ctx_t ctx; jika (len> LIMIT_DATA_SIZE_CBC || len% 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); kembali ATCA_BAD_PARAM; } Status ATCA_STATUS = atcab_init (cfg); jika (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, kunci, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, Ralat Kod 0x")); Serial.println (status, HEX); kembali; } int max = len / 16; untuk (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & plaintext [j * 16]); } jika (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (status, HEX); } status kembali; } status kembali; }

Saya mahu menyahsulitkan data sebelumnya (lihat di bawah, Langkah pertama). Untuk ini saya akan melakukan ini:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (plaintext)]; uint8_t decryptdata [sizeof (plaintext)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Teks yang didekripsi adalah:"); untuk (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } lain {// Lihat fail atca_status.h untuk kod Ralat Serial.print (F ("Mustahil melakukan penyahsulitan | Kesalahan Kod 0x")); Serial.println (status, HEX); kembali; }

Sekiranya tindakannya baik, anda akan mempunyai data yang didekripsi dalam pemboleh ubah "decryptdata".

Sekarang anda tahu bagaimana menggunakan enkripsi dan penyahsulitan dengan cip Atecc608a

Langkah 6: 5. Mengapa Anda Perlu Menggunakan Cip ini

Data yang disulitkan sangat berguna kerana anda dapat menyembunyikan maklumat anda dan menghantarnya melalui Wayarles atau hanya menyimpannya.

Berikut adalah beberapa contoh penggunaan:

  1. Menyimpan data ke EEPROM luaran: Anda boleh mendapatkan data EEPROM luaran dan jika seseorang masih EEPROM ini, dia akan memerlukan Kunci dan IV untuk penyahsulitan
  2. Hantar data Tanpa Wayar: Anda dapat mengirim data yang dienkripsi ini melalui Wayarles (nrf24L01, RFM95W…) dan jika seseorang memintas data anda, data ini akan selamat
  3. Kata laluan yang disimpan

Anda boleh melakukan banyak perkara dengan cip ini. Ia boleh digunakan dalam pelbagai projek. Sekiranya anda mempunyai masa, katakan dalam projek apa anda akan menggunakan cip ini?

Satu nasihat terakhir, jika anda membina beberapa projek tanpa wayar atau menyimpan beberapa data mentah, berhati-hatilah, keselamatan sangat penting dan jika anda tahu betapa mudahnya seorang "noob" memintas atau mencuri data anda. Sekarang dengan Internet, semua orang boleh mempunyai skrip untuk dilancarkan di komputer mereka hanya untuk "menggodam" anda!

Langkah 7: Kesimpulannya

Saya harap artikel ini berguna untuk anda. Maaf sekiranya saya melakukan kesalahan dalam teks saya tetapi bahasa Inggeris bukan bahasa utama saya dan saya bercakap lebih baik daripada saya menulis.

Terima kasih kerana membaca semuanya.

Nikmatinya.

Disyorkan: