Diposting oleh rakf

Sebagai bagian dari Summer of Hack 2019 di Digital Security, saya berurusan dengan serangan daya dan bekerja dengan ChipWhisperer.
Apa ini
Analisis energi adalah jenis serangan melalui saluran pihak ketiga. Yaitu, serangan yang menggunakan informasi yang muncul sebagai akibat dari implementasi fisik sistem.
Informasi apa yang mungkin berguna bagi penyerang:
- waktu konversi kriptografi;
- konsumsi daya;
- medan elektromagnetik;
- kebisingan dll
Serangan energi dianggap yang paling universal.
Mengapa ini berhasil?
Mikroprosesor, mikrokontroler, RAM, dan banyak sirkuit logika lainnya didasarkan pada teknologi CMOS. Konsumsi daya sirkuit CMOS terdiri dari dua komponen: statis dan dinamis. Konsumsi daya statis sangat kecil, yang merupakan salah satu alasan monopolisasi teknologi. Daya dinamis disebabkan oleh pengalihan transistor dan tergantung pada data yang diproses dan operasi yang dilakukan. Karena komponen statis terutama konstan, perubahan daya total disebabkan oleh daya dinamis dan, karenanya, konsumsi energi total dapat digunakan untuk analisis.
Toolkit
ChipWhisperer , saya menggunakan versi 2-bagian:

ChipWhisperer adalah toolkit open source untuk meneliti keamanan perangkat yang disematkan. Ini memungkinkan analisis energi dan serangan berbasis kesalahan.
Biaya akan dikenakan biaya $ 250. Pengembang memposisikannya sebagai solusi revolusioner, karena kompleks seperti itu, menurut pencipta, harganya mulai $ 30k. Perangkat ini terdiri dari 2 papan: papan target dan papan tangkap.
Ada versi lain, dengan kelebihan mereka (tetapi juga dengan biaya yang besar), Anda juga dapat secara terpisah membeli berbagai papan target, kartu ekspansi, menyelidiki untuk analisis penuh perangkat Anda dan menggunakan ChipWhisperer hanya untuk menghapus.
ChipWhisperer memiliki wiki yang sangat baik, laboratorium pengembangan kecil, dan pada versi ke 5 mereka bahkan membuat dokumentasi API yang baik. Lagu dihapus dari perangkat yang terhubung menggunakan perangkat lunak mereka dan dicatat sebagai array NumPy.
Pertama, Anda perlu menulis firmware untuk perangkat target. Sebagai bagian dari lab, cipher AES, DES, TEA dipertimbangkan. Bagi mereka, sudah ada firmware siap pakai dan pengaturan untuk menghapus jejak (jumlah sampel yang akan diambil, offset, frekuensi ADC, dll.). Untuk pengaturan penelitian independen harus dipilih secara eksperimental.
Seperti disebutkan di atas, Anda dapat memprovokasi kegagalan papan target: menyebabkan kerusakan sinyal jam, melewatkan instruksi dan mengekstrak informasi rahasia.
Dalam kompleks besar, osiloskop digunakan untuk melacak jejak.
Analisis
Ada beberapa metode analisis dasar:
- analisis daya sederhana (SPA);
- analisis daya diferensial (DPA);
- analisis korelasi daya (CPA).
Analisis daya sederhana mencakup analisis visual grafik daya. Misalnya, kata sandi dapat diperoleh satu karakter pada satu waktu dengan mengamati profil daya ketika karakter yang benar dimasukkan dan membandingkannya dengan yang salah.

Atau Anda dapat melihat putaran enkripsi di trek. Tidak cukup data untuk mendapatkan kunci, tetapi dapat diasumsikan algoritma mana yang dieksekusi. Angka tersebut jelas menunjukkan 10 putaran AES.

Analisis diferensial (DPA) jauh lebih efisien daripada analisis sederhana, DPA didasarkan pada metode analisis statistik untuk mendeteksi perbedaan dalam jejak daya. Namun, alat yang sangat efektif untuk "membuka" kunci akan membutuhkan sejumlah besar rute. Saya tidak menggunakan metode ini untuk analisis, tetapi pada akhirnya saya akan memberikan beberapa tautan ke sumber yang dijelaskan dengan baik.
Dasar analisis korelasi adalah perangkat statistik untuk menentukan kunci enkripsi rahasia. Kadang-kadang itu diisolasi dalam tipe yang terpisah, kadang-kadang disebut sebagai DPA. Metode ini membutuhkan lebih sedikit jejak daripada DPA, saya menggunakannya untuk analisis daya. Saya akan memberi tahu Anda lebih banyak tentang hal itu.
Tugas utama adalah membangun model konsumsi energi yang akurat dari perangkat yang diteliti. Jika model yang akurat dibangun, ada korelasi yang nyata antara nilai yang diprediksi dan yang sebenarnya.
Salah satu model kekuatan yang dapat digunakan adalah model berat Hamming. Berat Hamming adalah jumlah nilai non-nol dalam representasi biner. Asumsi model ini adalah bahwa jumlah bit yang diatur dalam register akan berkorelasi dengan energi yang dikonsumsi oleh perangkat. Berat Hamming sendiri digunakan selanjutnya sebagai unit energi konvensional. Model jarak Hamming juga digunakan - jumlah bit berbeda dalam 2 nilai.
Untuk membandingkan model berat Hamming dan konsumsi daya nyata, koefisien Pearson linier digunakan. Ini menunjukkan ketergantungan linear dari satu kuantitas pada kuantitas lainnya. Dengan model yang dibangun dengan benar, koefisien ini akan cenderung ke 1.
Algoritma BPA umum terdiri dari langkah-langkah utama berikut:
- hapus konsumsi daya saat mengonversi pesan pada tombol yang tidak dikenal;
- kami membangun model konsumsi energi chip ketika mengonversi pesan yang sama pada semua varian kunci sub-blok (256 opsi untuk setiap byte);
- kami menemukan koefisien korelasi linier untuk konsumsi daya yang disimulasikan dan nyata. Dalam kasus kunci sejati, koefisien akan cenderung ke 1;
- algoritme diulang untuk sub-blok kunci yang tersisa.
Akibatnya, kunci dikembalikan secara berurutan, dalam bagian-bagian kecil. Jika kita menyerang satu byte kunci pada suatu waktu, maka kita menggunakan 2 8 upaya untuk setiap kunci. Misalnya, jika Anda memilih AES - 128, maka jumlah total upaya untuk 16 byte kunci adalah 2 12 , yang jauh lebih baik daripada menekan 2 128 .
Analisis Sandi Magma
Magma adalah kode yang didefinisikan dalam GOST R 34.12-2015, pada kenyataannya GOST 28147-89 yang sama, hanya dalam profil. Blok terenkripsi melewati 32 putaran di mana beberapa transformasi terjadi. Kunci terdiri dari 256 bit, setiap tombol bulat adalah bagian dari aslinya.

Kami akan menganalisis data yang diperoleh menggunakan metode CPA.
Pertama, Anda perlu memilih nilai menengah dari algoritma, yang tergantung pada data yang diketahui dan sebagian kecil dari kunci dan dapat dihitung dengan transformasi sederhana. Biasanya nilai ini adalah output S-box (Magma sekarang memiliki 1 tabel substitusi, oleh karena itu lebih mudah untuk melakukan serangan seperti itu) dari yang pertama (teks terbuka diketahui) atau babak terakhir (cipherteks dikenal).
Saya meneliti kunci dengan teks terbuka terkenal, oleh karena itu opsi ini akan dipertimbangkan lebih lanjut. Dalam algoritma Magma, tidak seperti DES, AES, penambahan blok 32-bit dengan kunci bulat terjadi modulo 2 32 , oleh karena itu, lebih baik untuk memulai analisis dari output terakhir dari S-box, karena menambahkan nilai tertinggi tidak mempengaruhi yang lebih muda. Kami mempertimbangkan output dari masing-masing S-box: pertama 8, kemudian diberikan 8, 7 dan seterusnya sampai yang pertama. Penghapusan trek dilakukan pada mikrokontroler 8-bit, dan kita dapat mengasumsikan bahwa itu bekerja dengan dual S-box. Karena itu, saya akan menyerang segera dengan 1 byte.
Perhitungan model energi untuk byte kunci terakhir:
for kguess in range(0, 256):
di mana fungsi kebocoran hanya mengembalikan output S-box dari byte terakhir.
Kami menghitung koefisien Pearson linier untuk nilai-nilai yang disimulasikan dan nyata sesuai dengan rumus:

cpaoutput = [0]*256 maxcpa = [0]*256
Saat memilih subkunci sejati, koefisien korelasi akan memiliki lonjakan yang signifikan:

Dengan demikian, setiap byte dari tombol bulat dianalisis.
for bnum in range(0, 4): cpaoutput = [0]*256 maxcpa = [0]*256 for kguess in range(0, 256): best_round_key = kguess << (bnum * 8) | best_round ...
Mengingat kunci putaran pertama, kita dapat menghitung 2 dan tombol putaran berikutnya dengan cara yang sama. Kunci Magma lengkap dapat diperoleh dengan mengeluarkan 8 kunci bulat.
Dalam proses penyelesaian masalah ini, beberapa nuansa muncul. Tidak seperti AES, DES, cipher Belalang, penambahan kunci putaran plaintext terjadi modulo 2 32 . Penambahan bit rendah mempengaruhi tinggi, tidak seperti XORa. Saat menghitung setiap subkunci berikutnya, Anda harus memperhitungkan hasil dari masa lalu. Begitu pula dengan tombol bulat. Data ini sangat sensitif. Jika salah satu nilai dihitung secara tidak benar, perhitungan lebih lanjut dari seluruh kunci akan salah.
Perlu juga dipertimbangkan bahwa sekarang cukup sulit untuk menemukan chip yang memiliki arsitektur empat-bit: sebagian besar chip memiliki delapan-bit. Tentu saja, ada chip kriptografi khusus yang dirancang untuk algoritma konversi keamanan tertentu (atau beberapa algoritma) dan memiliki arsitektur paling efisien.
Untuk menjalankan DES cipher, prosesor kripto tersebut dapat memiliki arsitektur enam-bit, untuk Magma - empat-bit, yang memungkinkan setiap kotak-S diproses secara terpisah. Perangkat target saya adalah 8-bit, dan dalam kasus "Magma", konversi akan dilakukan pada delapan bit dalam satu pendekatan, yaitu penggantian akan dilakukan pada 2 S-box, konsumsi daya akan dipertimbangkan untuk 2 S-box. Jika salah satu S-box, senior atau junior, cocok dengan kunci sebenarnya, dan yang lain tidak cocok, ledakan korelasi tinggi dapat terjadi.
Dengan semua hal di atas, pada output kami memiliki skrip berikut untuk analisis jalur konsumsi energi untuk cipher Magma:
Skrip python import numpy as np path = r'C:\Users\user\chipwhisperer\projects\gost_10000_2_data\traces\2019.08.11-19.53.25_' traces = np.load(path + 'traces.npy') text = np.load(path + 'textin.npy') keys = np.load(path + 'keylist.npy') HW = [bin(n).count("1") for n in range(0,256)] SBOXES = {"Gost28147_tc26_ParamZ": ( (12, 4, 6, 2, 10, 5, 11, 9, 14, 8, 13, 7, 0, 3, 15, 1), (6, 8, 2, 3, 9, 10, 5, 12, 1, 14, 4, 7, 11, 13, 0, 15), (11, 3, 5, 8, 2, 15, 10, 13, 14, 1, 7, 4, 12, 9, 6, 0), (12, 8, 2, 1, 13, 4, 15, 6, 7, 0, 10, 5, 3, 14, 9, 11), (7, 15, 5, 10, 8, 1, 6, 13, 0, 9, 3, 14, 11, 4, 2, 12), (5, 13, 15, 6, 9, 2, 12, 10, 11, 7, 8, 1, 4, 3, 14, 0), (8, 14, 2, 5, 6, 9, 1, 12, 15, 4, 11, 0, 13, 10, 3, 7), (1, 7, 14, 13, 0, 5, 8, 3, 4, 15, 10, 6, 9, 12, 11, 2), )} def _K(s, _in): """ S-box substitution :param s: S-box :param _in: 32-bit word :returns: substituted 32-bit word """ return ( (s[0][(_in >> 0) & 0x0F] << 0) + (s[1][(_in >> 4) & 0x0F] << 4) + (s[2][(_in >> 8) & 0x0F] << 8) + (s[3][(_in >> 12) & 0x0F] << 12) + (s[4][(_in >> 16) & 0x0F] << 16) + (s[5][(_in >> 20) & 0x0F] << 20) + (s[6][(_in >> 24) & 0x0F] << 24) + (s[7][(_in >> 28) & 0x0F] << 28) ) def block2ns(data): """ Convert block to N1 and N2 integers """ data = bytearray(data) return ( data[7] | data[6] << 8 | data[5] << 16 | data[4] << 24, data[3] | data[2] << 8 | data[1] << 16 | data[0] << 24, ) def addmod(x, y, mod=2 ** 32): """ Modulo adding of two integers """ r = x + int(y) return r if r < mod else r - mod def _shift11(x): """ 11-bit cyclic shift """ return ((x << 11) & (2 ** 32 - 1)) | ((x >> (32 - 11)) & (2 ** 32 - 1)) def round(sbox, key, data, byte): s = SBOXES[sbox] _in = addmod(data, key) sbox_leak = _K(s, _in); return (sbox_leak >> (8 * byte)) & 0xFF def Feistel(sbox, key, data, nround): s = SBOXES[sbox] w = bytearray(key) x = [ w[3 + i * 4] | w[2 + i * 4] << 8 | w[1 + i * 4] << 16 | w[0 + i * 4] << 24 for i in range(8) ] n1, n2 = block2ns(data) for i in range(nround): n1, n2 = _shift11(_K(s, addmod(n1, x[i]))) ^ n2, n1 return n1 numtraces = len(traces) numpoint = np.shape(traces)[1] bestguess = [0]*32 round_data = [0] * numtraces for i in range(numtraces): round_data[i] = [0] * 8 for rnum in range(0, 8): best_round = 0 for tnum_r in range(numtraces): round_data[tnum_r][rnum] = Feistel("Gost28147_tc26_ParamZ", bestguess, text[tnum_r], rnum) for bnum in range(0, 4): cpaoutput = [0]*256 maxcpa = [0]*256 for kguess in range(0, 256):
Repositori Hasil GitHub
Kesimpulan
Sebagai bagian dari penelitian, saya bekerja dengan ChipWhisperer. Terlepas dari kenyataan bahwa saya tidak mencoba semua alat (misalnya, glitching), saya pasti menemukan ChipWhisperer bermanfaat, terutama jika Anda tidak ingin membeli perangkat keras khusus yang mahal.
Adapun analisis sandi kami untuk konsumsi daya, lebih tahan terhadap serangan ini daripada sandi yang diuraikan di atas, tetapi dengan data yang cukup, kuncinya dapat diperoleh tanpa masalah.
Bahan yang menarik: