Daftar Isi:

Keamanan Dengan Arduino: Atecc608a: 7 Langkah
Keamanan Dengan Arduino: Atecc608a: 7 Langkah

Video: Keamanan Dengan Arduino: Atecc608a: 7 Langkah

Video: Keamanan Dengan Arduino: Atecc608a: 7 Langkah
Video: Secure Boot with ATECC608A 2024, Juli
Anonim
Keamanan Dengan Arduino: Atecc608a
Keamanan Dengan Arduino: Atecc608a
Keamanan Dengan Arduino: Atecc608a
Keamanan Dengan Arduino: Atecc608a

Tema

Halo semuanya !

Ini adalah Artikel Instructables pertama saya jadi saya harap ini akan menarik bagi Anda semua.

Pada artikel ini, saya akan menjelaskan cara menggunakan chip mikro yang disebut "ATECC608A" yang menyediakan beberapa alat keamanan.

Chip ini telah dirancang oleh MicroChip dan merupakan versi terakhir dari "chip CryptoAuthentication". Sebelum versi ini, ada "ATSHA204A" dan "ATECC508A".

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

Versi ini adalah chip paling canggih dan memiliki fungsionalitas yang tidak dimiliki versi lama (Misalnya: modul AES, modul perlindungan IO …).

Mengapa proyek ini?

Saya bekerja di domain CyberSecurity dan seperti semua orang, saya menyukai pemrograman dan elektronik. Selama studi saya, saya mendapatkan konferensi dengan seorang spesialis Keamanan IoT yang menunjukkan kepada kami bahwa Industri tidak menggunakan Keamanan dalam objek IoT mereka. Saya menunjukkan kepada kami gembok yang dapat dibuka dengan ponsel cerdas Anda melalui Bluetooth. Pada gembok tersebut terdapat kalimat yang berbunyi “Ini gembok yang paling aman dari pada gembok kunci!”. Kalimat ini membuatnya tersenyum dan dia memodifikasi kalimat "Ini gembok yang paling buruk yang pernah dibuat!".

Dia menunjukkan kepada kami dengan PC-nya sendiri dan sniffer Bluetooth bahwa setiap perintah yang dikirim oleh smartphone adalah sama setiap kali dan sangat mudah untuk menyalin perintah ini dan mengirimkannya dengan smartphone Anda. Dia menjelaskan kepada kami bahwa "Keamanan" untuk "Industri" bukanlah masalah utama. Dia menunjukkan kepada kami chip (kurang dari $0,60) yang dapat menambahkan lapisan keamanan ke objek ini.

Setelah demonstrasi ini, saya mencoba menemukan beberapa proyek Open source yang menambahkan lapisan keamanan ke objek IoT tetapi saya tidak pernah menemukannya.

Jadi saya memutuskan untuk mengerjakan proyek yang menggunakan lapisan keamanan untuk komunikasi antara dua objek IoT.

Apa ide saya?

Selama komunikasi antara dua Obyek IoT, beberapa serangan dapat terjadi: Man Of the mild, Salinan informasi dan banyak lagi.. Jadi ide saya sangat sederhana:

  1. Pemanfaatan data terenkripsi antara dua atau lebih objek IoT.
  2. Persediaan berbiaya rendah
  3. Dapat bekerja dengan Arduino UNO

Sekarang saya akan menjelaskan bagaimana saya menerapkan gambar abstrak ini dengan Arduino dan chip Atecc608a. Pada artikel ini, saya akan menjelaskan cara menggunakan Arduino UNO dengan ATECC608A.

Saya akan menulis artikel tentang komunikasi dua objek lain kali.

Perlengkapan

Anda memerlukan beberapa hal untuk proyek ini:

  1. Arduino UNO atau MEGA (Chip harus Atmega 328 atau ATMEGA 2560)
  2. Chip Atecc608A (masing-masing berharga kurang dari $0,80, mudah ditemukan di situs web pemasok Anda)
  3. Adaptor SOIC 8-Pin
  4. Beberapa kabel dan resistor

Datasheet dari versi sebelumnya dari chip ini (Atecc508a) tersedia di sini -> Datasheet Atecc508a

Langkah 1: Langkah demi Langkah

Selangkah demi selangkah
Selangkah demi selangkah

Pada artikel ini, saya akan menunjukkan kepada Anda cara memodifikasi konfigurasi chip ini dan setelah cara mengenkripsi data menggunakan Algoritma AES CBC.

Kami akan mengikuti langkah-langkah tersebut:

  1. Desain sirkuit
  2. Konfigurasi chip ini
  3. Pemanfaatan modul AES CBC
  4. Mengapa Anda perlu menggunakan chip ini?

Untuk setiap langkah, saya akan merinci semuanya untuk Anda. Juga, saya menambahkan kode saya di Github saya dengan komentar untuk setiap fungsi. Jika Anda memiliki beberapa pertanyaan tentang kode saya atau proyek ini, saya akan dengan senang hati menjawabnya.

Github saya: Github saya

Langkah 2: Peringatan Tentang Atecc608a

Peringatan Tentang Atecc608a
Peringatan Tentang Atecc608a

Chip Atecc608a bukanlah chip yang "mudah".

Pertama, dokumentasi chip ini di bawah NDA sehingga Anda tidak akan menemukannya secara lengkap di Internet. Tapi tidak masalah untuk ini, datasheet versi sebelumnya tersedia di Internet Datasheet Complete ATECC508A.

Kedua, ketika Anda menggunakan chip ini, Anda perlu mengunci konfigurasinya dan tidak mungkin untuk mengubah konfigurasi chip jika terkunci. Jadi berhati-hatilah saat akan mengunci Config Zone dan Data Zone.

Ketiga, library yang ditulis dalam C sangat besar dan lengkap, sehingga Anda harus membaca dokumentasi fungsi-fungsi yang akan Anda gunakan sebelumnya.

Empat, perpustakaan menulis bahwa chip ini tidak berfungsi untuk Arduino UNO, tetapi menambahkan fungsionalitas yang diperlukan untuk bekerja dengan Arduino UNO.

Chip ATECC608A

Anda dapat berkomunikasi dengan chip ini dengan I2C. Alamat chip ini dapat dimodifikasi dalam konfigurasi.

Chip ini berisi 16 slot berbeda yang dapat berisi berbagai jenis data:

  1. Kunci ECC (pribadi atau publik)
  2. Kunci AES
  3. Data lain (seperti hash Sha atau hanya kata-kata)

Dalam kasus kami, kami akan menyimpan Kunci AES dalam satu slot.

Langkah 3: 1. Desain Sirkuit

1. Perancangan Sirkuit
1. Perancangan Sirkuit
1. Perancangan Sirkuit
1. Perancangan Sirkuit

1. Desain sirkuit

Skema rangkaian ini sangat sederhana!

Anda perlu menggunakan daya 3.3V karena rekomendasinya antara 2.0V dan 5.5V tetapi saya lebih suka menggunakan 3.3V.

Untuk chip ini, biasanya Anda memiliki titik di sudut chip, titik ini adalah Pin 1 dari papan ini. Saya menambahkan tampilan Atas Atecc608a dengan Nomor PIN karena merupakan SOIC 8-Lead sehingga chipnya 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 daya 3.3V karena rekomendasinya antara 2.0V dan 5.5V tetapi saya lebih suka menggunakan 3.3V.

Saya menambahkan tampilan atas Atecc608a karena merupakan SOIC 8-Lead sehingga chipnya sangat kecil. Jika Anda mau, jadi pemasok membuat papan dengan solder chip, itu bisa lebih mudah bagi Anda.

Peringatan: Dalam kasus saya, saya harus menambahkan resistor antara SDA Arduino dan Chip (juga untuk SDL). Saya menambahkan resistor 4.7Kohm untuk masing-masing.

Langkah 4: 2. Konfigurasi Chip (Atecc608a)

Sebelum menggunakan fungsi enkripsi atau dekripsi, Anda perlu mengkonfigurasi chip. Pada langkah ini, saya akan merinci setiap langkah yang perlu Anda lakukan untuk konfigurasi chip ini.

Peringatan: langkah ini sangat impor dan jika Anda mengunci zona sebelum akhir, Anda tidak dapat mengubahnya.

Seperti yang dijelaskan sebelumnya, chip ini mendapat dua zona:

  1. Zona Konfigurasi
  2. Zona Data

Zona konfigurasi mendapat ukuran 128 byte tetapi 16 byte pertama tidak dapat dimodifikasi.

Untuk mengkonfigurasi chip ini, Anda perlu dua mengikuti langkah tersebut. Sangat penting untuk mengikuti setiap langkah secara berurutan atau konfigurasi Anda tidak akan berfungsi, dan chip Anda akan terkunci dan tidak dapat digunakan. Langkah-langkah tersebut adalah:

  1. Buat template konfigurasi
  2. Tulis templat ini ke chip
  3. Kunci Zona Konfigurasi
  4. Tulis Kunci AES Anda (128 Bit) di slot
  5. Kunci Zona Data

Informasi

Di bawah ini saya merinci setiap langkah konfigurasi dengan kode saya, tetapi jangan khawatir, saya menambahkan contoh konfigurasi lengkap di Github saya. Saya memberikan komentar pada setiap fungsi, dan file *.ino tersedia dengan setiap langkah untuk Anda.

  • Github saya: Github saya
  • Jalur Konfigurasi Contoh: configuration_example.ino

Langkah pertama: Buat template konfigurasi

Seperti dijelaskan sebelumnya, zona konfigurasi mendapatkan ukuran 128 bit, tetapi 16 bit pertama tidak dapat diubah. Zona ini terdiri dari beberapa bagian, tetapi Anda hanya perlu mengetahui 3 bagian dari zona konfigurasi ini untuk proyek ini:

  1. Bytes 16 -> Ini adalah alamat I2C dari chip
  2. Bytes 20 hingga 51 -> Anda dapat memodifikasi di sini jenis Slot untuk 16 slot chip ini
  3. Bytes 96 hingga 127 -> Anda dapat mengatur di sini Jenis kunci atau data yang digunakan di setiap slot.

(Jika Anda membutuhkan penjelasan lebih lanjut dari semua zona ini, silakan baca dokumentasi (halaman 13, bagian 2.2))

Di sini, saya memasukkan rincian setiap Bytes/Bagian dari 112 byte dari konfigurasi sebuah Chip. Ini adalah contoh, setiap chip yang dibeli dapat memiliki konfigurasi yang berbeda:

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 Konfigurasi Slot 15 0xAF, 0x8F, // Slot Konfigurasi 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, 0xFF, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Slot Konfigurasi Kunci 1 0x33, 0x00, // Slot Konfigurasi Kunci 2 0x33, 0x00, // Slot Konfigurasi Kunci 3 0x1C, 0x00, // Slot Konfigurasi 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 terlihat, saya memberikan beberapa komentar dalam kode ini untuk lebih memahami konfigurasi ini.

Dalam kasus Anda perlu memahami hanya tiga hal:

  1. Bytes 16 -> Ini adalah alamat I2C dari chip
  2. Bytes 20 hingga 51 -> Anda dapat memodifikasi di sini jenis Slot untuk 16 slot chip ini
  3. Byte 96 hingga 127 -> Anda dapat mengatur di sini Jenis kunci atau data yang digunakan di setiap slot.

Saya tidak akan menjelaskan jenis konfigurasi dan mengapa saya menggunakan ini dan bukan yang lain karena rumit untuk menjelaskan semuanya. Jika Anda memerlukan informasi lebih lanjut, buka dokumentasi, halaman 16 bagian 2.2.1 untuk "SlotConfig" dan halaman 19 bagian 2.2.5 untuk "KeyConfig"

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

Untuk ini, kita perlu meletakkan (jika perlu, Anda dapat menyalin contoh di atas, modifikasi telah dilakukan di dalamnya):

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

Mengapa saya mengatur konfigurasi ini: Untuk setiap slot chip ini, Anda dapat mengatur parameter untuk mengatakan kepada chip jenis data apa yang akan disimpan. Anda memiliki beberapa parameter:

  • Slot dapat ditulis atau dibaca (menghapus atau mengenkripsi tindakan)
  • Jenis data yang disimpan (kunci ECC, Kunci Publik, SHA Hash, Kunci AES …)
  • Slot dapat dikunci
  • Pembuatan kunci diperbolehkan

Dengan byte 36 dan 37 disetel ke "0x0F8F":

  • Data dapat ditulis di Clear
  • Isi slot ini bersifat rahasia dan tidak dapat dibaca
  • Slot tidak dapat digunakan untuk perintah CheckMac Copy

Dengan byte 112 dan 113 disetel ke "0x001A":

Slot dapat menyimpan hingga empat kunci simetris AES 128-bit (KeyType = 0x6)

Langkah kedua: Tulis konfigurasi ini

Langkah ini sangat penting karena kami akan mengatur chip dengan konfigurasi kami dan jika konfigurasi ini tidak baik, Anda akan menggunakan chip ini.

Tapi jangan khawatir, selama Konfigurasi tidak terkunci, Anda dapat mengubah konfigurasi Anda.

Di sini, ini kode yang digunakan untuk menulis konfigurasi ke chip:

/** \brief Tulis konfigurasi baru pada chip.

* \param[dalam] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] config Array uint8_t konfigurasi (panjang 112) * \param[in] len Ukuran array konfigurasi * \return ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS write_configuration(ATCAIfaceCfg *cfg, uint8_t *config, size_t len) { if (len != 112) return ATCA_BAD_PARAM; status ATCA_STATUS; status = atcab_init(cfg); if (status == ATCA_SUCCESS) { // Tulis konfigurasi Array ke chip // Padding 16 byte (16 byte pertama tidak dapat ditulis) status = atcab_write_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, (uint8_t *)config, len); status pengembalian; } mengembalikan status; }

Fungsi ini akan menulis konfigurasi Anda dalam chip.

Langkah ketiga: mengunci Zona konfigurasi

Peringatan: hati-hati dengan langkah ini, jika Anda mengunci Zona ini dan konfigurasi Anda tidak baik, chip tidak dapat digunakan dan Anda tidak dapat mengubah zona ini

Untuk tindakan ini, kami akan menggunakan fungsi ini:

/** \brief Periksa apakah DATA_ZONE atau CONFIG_ZONE terkunci

* \param[dalam] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] zona LOCK_ZONE_DATA atau LOCK_ZONE_CONFIG * \mengembalikan ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS check_lock_zone(ATCAIfaceCfg *cfg, uint8_t zone) { ATCA_STATUS status; kunci bool = salah; jika (zona != (uint8_t)LOCK_ZONE_CONFIG && zona != (uint8_t)LOCK_ZONE_DATA) mengembalikan 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) { kembalikan ATCA_NOT_LOCKED; } kembalikan ATCA_SUCCESS; } kembalikan ATCA_BAD_PARAM; } check_lock_zone(&cfg, LOCK_ZONE_CONFIG);

Langkah keempat: Tulis Anda Kunci AES di slot

Di bagian ini Anda akan mengatur kunci AES pribadi Anda di slot yang telah Anda tentukan dalam konfigurasi chip.

Untuk contoh ini, saya akan menggunakan slot nomor 9 dari chip.

Perlu Anda ketahui: Keistimewaan chip ini adalah Anda dapat menulis data di slot hanya dengan 4 byte atau 32 byte. Untuk AES kita membutuhkan 128 bit Key jadi 16 byte data. Jadi saya memutuskan untuk menulis ke kunci masing-masing 16 byte di slot ini untuk memiliki data 32 byte.

Sekarang, saya akan menunjukkan kepada Anda kode yang digunakan:

/** \brief Tulis kunci AES di slot tertentu. * \param[dalam] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] nomor slot kunci kunci * \param[in] array kunci datakey uint8_t * \param[in] len Ukuran array kunci * \return ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS write_key_slot(ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) { if (key 16) return ATCA_BAD_PARAM; jika (len != 32) mengembalikan ATCA_BAD_PARAM; ATCA_STATUS status = atcab_init(cfg); if (status == ATCA_SUCCESS) { status = atcab_write_zone(ATCA_ZONE_DATA, (uint16_t)key, 0, 0, datakey, 32); jika (status != ATCA_SUCCESS) mengembalikan status; } mengembalikan status; }

Untuk contoh ini, saya akan menggunakan dua Kunci AES masing-masing 16 byte:

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

Jika tindakan ini bagus, sekarang Anda harus melewati langkah terakhir "mengunci zona data"

Langkah terakhir: kunci Zona Data

Peringatan: hati-hati dengan langkah ini, jika Anda mengunci Zona ini dan data Anda tidak disetel, chip tidak dapat digunakan dan Anda tidak dapat mengubah zona ini

Untuk tindakan ini, kami akan menggunakan fungsi ini:

/** \brief Periksa apakah DATA_ZONE atau CONFIG_ZONE terkunci

* \param[dalam] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] zona LOCK_ZONE_DATA atau LOCK_ZONE_CONFIG * \mengembalikan ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS check_lock_zone(ATCAIfaceCfg *cfg, uint8_t zone) { ATCA_STATUS status; kunci bool = salah; jika (zona != (uint8_t)LOCK_ZONE_CONFIG && zona != (uint8_t)LOCK_ZONE_DATA) mengembalikan 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) { kembalikan ATCA_NOT_LOCKED; } kembalikan ATCA_SUCCESS; } kembalikan ATCA_BAD_PARAM; } check_lock_zone(&cfg, LOCK_ZONE_DATA);

Jika tindakan ini bagus, chip Anda siap digunakan

Langkah 5: 3. Pemanfaatan Modul AES CBC

3. Pemanfaatan Modul AES CBC
3. Pemanfaatan Modul AES CBC

Saya akan menjelaskan cara mengenkripsi dan mendekripsi data dengan algoritma AES CBC dan chip Atecc608a.

Ingat: Sebelum menggunakan fungsi ini, Anda perlu mengatur chip. Untuk ini, ikuti langkah 2 dari artikel ini

Chip ini mendapat beberapa jenis modul AES (AES 128 bit), hanya AES 128 bit yang mungkin:

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

Untuk membuatnya lebih mudah digunakan, saya membuat dua fungsi:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Kedua fungsi tersebut tersedia di Github saya.

Penjelasan

Saya memilih menggunakan Algoritma AES CBC karena lebih aman daripada AES 128 bit dasar. Algoritma ini menggunakan Vektor Awal untuk mengenkripsi data Anda.

Informasi

Di bawah ini saya merinci setiap langkah metode enkripsi dan dekripsi. Tapi saya menulis kode untuk Arduino yang menggunakan kedua fungsi tersebut. Anda dapat melihat kode ini di Github saya:

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

Langkah pertama: Enkripsi data Anda

Di bagian ini, saya akan menunjukkan cara mengenkripsi data Anda.

Pertama, Anda akan membutuhkan fungsi ini:

/** \brief Enkripsi data menggunakan algoritma AES CBC * \param[in] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] data Words to encypt (harus dibagi 16, max length 240) * \param[in] len length Words to encypt (harus dibagi 16, panjang maksimal 240) * \param[out] iv Vektor Awal yang digunakan dalam AES CBC (mengembalikan vektor dalam var ini) * \param[out] ciphertext mengembalikan ke sini teks Cypher * \param[in] kunci Nomor slot dari key * \kembalikan ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS aes_cbc_encrypt(ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *ciphertext, uint8_t key) { atca_aes_cbc_ctx_t ctx; if (len > LIMIT_DATA_SIZE_CBC && len % 16 != 0) { Serial.print(F("ERROR: ATCA_BAD_PARAM")); kembalikan 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, key, 0, tmp_iv); if (status != ATCA_SUCCESS) { Serial.print(F("ERROR Encrypt: atcab_aes_cbc_init, Kode Error 0x")); Serial.println(status, HEX); kembali; } memcpy(iv, tmp_iv, IV_LENGTH_CBC); memcpy(tmp_data, data, len); int maks = len / 16; for (int j = 0; j < max; j++) { status = atcab_aes_cbc_encrypt_block(&ctx, &tmp_data[j * 16], &ciphertext[j * 16]); } if (status != ATCA_SUCCESS) { Serial.print(F("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Kode Error 0x")); Serial.println(status, HEX); } mengembalikan status; } mengembalikan status; }

Fungsi ini mudah digunakan, Anda harus mengatur dua hal:

  1. IV kosong (Vektor Awal) 16 Bytes
  2. Data untuk dienkripsi (ukuran maksimal 240 Bytes)

Berikut contoh "cara menggunakan fungsi ini".

Saya ingin mengenkripsi kata "AAAAAAAAAAAAAAA", dengan kunci saya tulis di nomor slot "9":

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

Jika aksinya bagus, Anda akan memiliki data terenkripsi di variabel "cypherdata" dan Vektor Awal di variabel "IV".

Simpan kedua variabel tersebut untuk mendekripsi teks Anda!

Langkah kedua: dekripsi data Anda

Untuk mendekripsi data Anda, Anda memerlukan dua hal:

  1. Vektor Awal
  2. Data Cypher (data terenkripsi)

Untuk mendekripsi data Anda, Anda memerlukan fungsi ini:

/** \brief Dekripsi data menggunakan algoritma AES CBC * \param[in] cfg Konfigurasi antarmuka logis. Beberapa konfigurasi * yang telah ditentukan sebelumnya dapat ditemukan di atca_cfgs.h * \param[in] ciphertext Kata yang akan didekripsi (harus dibagi 16, panjang maksimal 240) * \param[in] len panjang Kata yang akan didekripsi (harus dibagi 16, max length 240) * \param[in] iv Initial Vector untuk digunakan dalam AES CBC * \param[out] plaintext kembali ke sini teks yang didekripsi * \param[in] key Nomor slot kunci * \return ATCA_SUCCESS jika berhasil, jika tidak, kode kesalahan. */ ATCA_STATUS aes_cbc_decrypt(ATCAIfaceCfg *cfg, uint8_t *ciphertext, int len, uint8_t *iv, uint8_t *plaintext, uint8_t key) { atca_aes_cbc_ctx_t ctx; if (len > LIMIT_DATA_SIZE_CBC || len % 16 != 0) { Serial.print(F("ERROR Decrypt: ATCA_BAD_PARAM")); kembalikan ATCA_BAD_PARAM; } ATCA_STATUS status = atcab_init(cfg); if (status == ATCA_SUCCESS) { status = atcab_aes_cbc_init(&ctx, key, 0, iv); if (status != ATCA_SUCCESS) { Serial.print(F("ERROR Decrypt: atcab_aes_cbc_init, Kode Error 0x")); Serial.println(status, HEX); kembali; } int maks = len / 16; for (int j = 0; j < max; j++) { status = atcab_aes_cbc_decrypt_block(&ctx, &ciphertext[j * 16], &plaintext[j * 16]); } if (status != ATCA_SUCCESS) { Serial.print(F("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Kode Error 0x")); Serial.println(status, HEX); } mengembalikan status; } mengembalikan status; }

Saya ingin mendekripsi data saya 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: "); for (size_t i = 0; i < sizeof(decryptdata); i++) { Serial.print((char)decryptdata); } Serial.println(""); } else { // Lihat file atca_status.h untuk kode Error Serial.print(F("Impossible do the decryption | Code Error 0x")); Serial.println(status, HEX); kembali; }

Jika tindakannya bagus, Anda akan memiliki data yang didekripsi dalam variabel "decryptdata".

Sekarang Anda tahu cara menggunakan enkripsi dan dekripsi dengan chip Atecc608a

Langkah 6: 5. Mengapa Anda Perlu Menggunakan Chip Ini

Data terenkripsi sangat berguna karena Anda dapat menyembunyikan informasi Anda dan mengirimkannya melalui Nirkabel atau hanya menyimpannya.

Berikut beberapa contoh pemanfaatan:

  1. Data yang disimpan ke EEPROM eksternal: Anda dapat mengamankan data EEPROM eksternal dan jika seseorang masih menyimpan EEPROM ini, dia akan memerlukan Kunci dan IV untuk dekripsi
  2. Kirim data Nirkabel: Anda dapat mengirim data terenkripsi ini dengan Nirkabel (nrf24L01, RFM95W…) dan jika seseorang mencegat data Anda, data ini akan aman
  3. Kata sandi tersimpan

Anda dapat melakukan banyak hal dengan chip ini. Hal ini dapat digunakan dalam beberapa proyek. Jika Anda punya waktu, katakan padaku dalam proyek apa Anda akan menggunakan chip ini?

Satu saran terakhir, jika Anda membangun beberapa proyek nirkabel atau menyimpan beberapa data mentah, berhati-hatilah, keamanan sangat penting dan jika Anda tahu betapa mudahnya bagi "noob" untuk mencegat atau mencuri data Anda. Sekarang dengan Internet, setiap orang dapat memiliki skrip untuk diluncurkan di komputer mereka hanya untuk "meretas" Anda!

Langkah 7: Kesimpulan

Saya harap artikel ini akan bermanfaat bagi Anda. Maaf jika saya melakukan kesalahan dalam teks saya tetapi bahasa Inggris bukan bahasa utama saya dan saya berbicara lebih baik daripada saya menulis.

Terima kasih telah membaca semuanya.

Bersenang senang lah.

Direkomendasikan: