Manakah dari mereka yang lebih disukai dalam situasi apa?
Saya ingin melihat daftar evaluasi crtieria untuk berbagai mode, dan mungkin diskusi tentang penerapan setiap kriteria.
Sebagai contoh, saya pikir salah satu kriteria adalah "ukuran kode" untuk enkripsi dan dekripsi, yang penting untuk sistem tertanam kode-mikro, seperti adapter jaringan 802.11. JIKA kode yang diperlukan untuk mengimplementasikan CBC jauh lebih kecil daripada yang diperlukan untuk CTR (saya tidak tahu ini benar, itu hanya sebuah contoh), maka saya bisa mengerti mengapa mode dengan kode yang lebih kecil lebih disukai. Tetapi jika saya menulis aplikasi yang berjalan di server, dan perpustakaan AES saya menggunakan mengimplementasikan CBC dan CTR, maka kriteria ini tidak relevan.
Lihat apa yang saya maksud dengan "daftar kriteria evaluasi dan penerapan setiap kriteria" ??
Ini tidak benar-benar terkait pemrograman tetapi terkait algoritma.
sumber
Jawaban:
ECB tidak boleh digunakan jika mengenkripsi lebih dari satu blok data dengan kunci yang sama.
CBC, OFB dan CFB serupa, namun OFB / CFB lebih baik karena Anda hanya perlu enkripsi dan bukan dekripsi, yang dapat menghemat ruang kode.
CTR digunakan jika Anda ingin paralelisasi yang baik (mis. Kecepatan), bukan CBC / OFB / CFB.
Mode XTS adalah yang paling umum jika Anda menyandikan data yang dapat diakses secara acak (seperti hard disk atau RAM).
OCB sejauh ini merupakan mode terbaik, karena memungkinkan enkripsi dan otentikasi dalam sekali jalan. Namun ada paten di Amerika Serikat.
Satu-satunya hal yang harus Anda ketahui adalah bahwa ECB tidak akan digunakan kecuali jika Anda hanya mengenkripsi 1 blok. XTS harus digunakan jika Anda mengenkripsi data yang diakses secara acak dan bukan stream.
sumber
Harap pertimbangkan lama dan sulit jika Anda tidak dapat menerapkan kriptografi Anda sendiri
Kebenaran jelek dari masalah ini adalah bahwa jika Anda mengajukan pertanyaan ini, Anda mungkin tidak akan dapat merancang dan mengimplementasikan sistem yang aman.
Biarkan saya mengilustrasikan poin saya: Bayangkan Anda sedang membangun aplikasi web dan Anda perlu menyimpan beberapa data sesi. Anda bisa menetapkan setiap pengguna ID sesi dan menyimpan data sesi di server dalam ID sesi pemetaan peta hash ke data sesi. Tetapi kemudian Anda harus berurusan dengan keadaan sial ini di server dan jika pada titik tertentu Anda membutuhkan lebih dari satu server hal-hal akan menjadi berantakan. Jadi alih-alih Anda memiliki ide untuk menyimpan data sesi dalam cookie di sisi klien. Anda akan mengenkripsi itu tentu saja sehingga pengguna tidak dapat membaca dan memanipulasi data. Jadi mode apa yang harus Anda gunakan? Datang ke sini Anda membaca jawaban teratas (maaf karena memilih Anda keluar dari myforwik). Yang pertama tertutup - ECB - bukan untuk Anda, Anda ingin mengenkripsi lebih dari satu blok, yang berikutnya - CBC - terdengar bagus dan Anda tidak memerlukan paralelisme CTR, Anda tidak perlu akses acak, jadi tidak ada XTS dan paten adalah PITA, jadi tidak ada OCB. Menggunakan pustaka crypto Anda, Anda menyadari bahwa Anda memerlukan beberapa padding karena Anda hanya dapat mengenkripsi kelipatan ukuran blok. Anda memilihPKCS7 karena didefinisikan dalam beberapa standar kriptografi serius. Setelah membaca bahwa CBC terbukti aman jika digunakan dengan IV acak dan cipher blok aman, Anda merasa tenang walaupun Anda menyimpan data sensitif Anda di sisi klien.
Bertahun-tahun kemudian setelah layanan Anda benar-benar tumbuh ke ukuran yang signifikan, seorang spesialis keamanan TI menghubungi Anda dalam pengungkapan yang bertanggung jawab. Dia memberi tahu Anda bahwa dia dapat mendekripsi semua cookie Anda menggunakan serangan oracle padding , karena kode Anda menghasilkan halaman kesalahan jika paddingnya entah bagaimana rusak.
Ini bukan skenario hipotetis: Microsoft memiliki kekurangan ini di ASP.NET sampai beberapa tahun yang lalu.
Masalahnya adalah ada banyak jebakan tentang kriptografi dan sangat mudah untuk membangun sistem yang terlihat aman bagi orang awam tetapi sepele untuk istirahat bagi penyerang berpengetahuan.
Apa yang harus dilakukan jika Anda perlu mengenkripsi data
Untuk koneksi langsung, gunakan TLS (pastikan untuk memeriksa nama host sertifikat dan rantai penerbit). Jika Anda tidak dapat menggunakan TLS, cari API tingkat tertinggi yang ditawarkan sistem Anda untuk tugas Anda dan pastikan Anda memahami jaminan yang ditawarkannya dan yang lebih penting apa yang tidak dijaminnya. Untuk contoh di atas kerangka kerja seperti Play menawarkan fasilitas penyimpanan sisi klien , itu tidak membatalkan data yang disimpan setelah beberapa waktu, dan jika Anda mengubah keadaan sisi klien, penyerang dapat mengembalikan keadaan sebelumnya tanpa Anda sadari.
Jika tidak ada abstraksi tingkat tinggi yang tersedia gunakan pustaka crypto tingkat tinggi. Contoh yang menonjol adalah NaCl dan implementasi portabel dengan banyak ikatan bahasa adalah Sodium . Menggunakan perpustakaan seperti itu Anda tidak perlu peduli dengan mode enkripsi dll. Tetapi Anda harus lebih berhati-hati tentang detail penggunaan daripada dengan abstraksi tingkat yang lebih tinggi, seperti tidak pernah menggunakan nonce dua kali.
Jika karena alasan tertentu Anda tidak dapat menggunakan pustaka crypto tingkat tinggi, misalnya karena Anda perlu berinteraksi dengan sistem yang ada dengan cara tertentu, tidak ada cara untuk mendidik diri sendiri secara menyeluruh. Saya merekomendasikan membaca Teknik Kriptografi oleh Ferguson, Kohno dan Schneier . Tolong jangan membodohi diri sendiri dengan percaya bahwa Anda dapat membangun sistem yang aman tanpa latar belakang yang diperlukan. Kriptografi sangat halus dan hampir tidak mungkin untuk menguji keamanan suatu sistem.
Perbandingan mode
Hanya enkripsi:
Enkripsi terotentikasi:
Untuk mencegah padding serangan oracle dan perubahan pada ciphertext, seseorang dapat menghitung kode otentikasi pesan (MAC) pada ciphertext dan hanya mendekripsi itu jika belum dirusak. Ini disebut mengenkripsi-lalu-mac dan harus lebih disukai daripada pesanan lain . Kecuali untuk kasus penggunaan sangat sedikit, keaslian sama pentingnya dengan kerahasiaan (yang terakhir adalah tujuan enkripsi). Skema enkripsi terotentikasi (dengan data terkait (AEAD)) menggabungkan proses enkripsi dan otentikasi dua bagian menjadi mode blok cipher yang juga menghasilkan tag otentikasi dalam proses tersebut. Dalam kebanyakan kasus ini menghasilkan peningkatan kecepatan.
Rekomendasi:
Mempertimbangkan pentingnya otentikasi, saya akan merekomendasikan dua mode cipher blok berikut untuk kebanyakan kasus penggunaan (kecuali untuk tujuan enkripsi disk): Jika data diautentikasi oleh tanda tangan asimetris gunakan CBC, jika tidak gunakan GCM.
sumber
https://your.server
di mana-mana di aplikasi Anda, daripada membuat beberapa protokol pertukaran kunci dan dapatkan pustaka kriptografi di kedua sisi untuk bekerja bersama dengan lancar.Analisis formal telah dilakukan oleh Phil Rogaway pada 2011, di sini . Bagian 1.6 memberikan ringkasan yang saya transkripsikan di sini, menambahkan penekanan saya sendiri dalam huruf tebal (jika Anda tidak sabar, maka rekomendasinya adalah menggunakan mode CTR, tetapi saya menyarankan Anda membaca paragraf saya tentang integritas pesan versus enkripsi di bawah).
Perhatikan bahwa sebagian besar dari ini memerlukan IV untuk menjadi acak, yang berarti tidak dapat diprediksi dan karenanya harus dihasilkan dengan keamanan kriptografi. Namun, beberapa hanya memerlukan "nonce", yang tidak menuntut properti itu tetapi sebaliknya hanya mengharuskan itu tidak digunakan kembali. Oleh karena itu desain yang mengandalkan nonce lebih rentan kesalahan daripada desain yang tidak (dan percayalah, saya telah melihat banyak kasus di mana CBC tidak dilaksanakan dengan pemilihan IV yang tepat). Jadi, Anda akan melihat bahwa saya telah menambahkan dengan berani ketika Rogaway mengatakan sesuatu seperti "kerahasiaan tidak tercapai ketika IV adalah nonce", itu berarti bahwa jika Anda memilih IV Anda yang aman secara kriptografis (tidak dapat diprediksi), maka tidak ada masalah. Tetapi jika tidak, maka Anda kehilangan sifat keamanan yang baik. Jangan sekali-kali menggunakan kembali infus untuk mode-mode ini.
Juga, penting untuk memahami perbedaan antara integritas pesan dan enkripsi. Enkripsi menyembunyikan data, tetapi penyerang mungkin dapat memodifikasi data yang dienkripsi, dan hasilnya berpotensi diterima oleh perangkat lunak Anda jika Anda tidak memeriksa integritas pesan. Sementara pengembang akan mengatakan "tetapi data yang dimodifikasi akan kembali sebagai sampah setelah dekripsi", seorang insinyur keamanan yang baik akan menemukan kemungkinan bahwa sampah tersebut menyebabkan perilaku buruk dalam perangkat lunak, dan kemudian ia akan mengubah analisis itu menjadi serangan nyata. Saya telah melihat banyak kasus di mana enkripsi digunakan tetapi integritas pesan sangat dibutuhkan lebih dari enkripsi. Pahami apa yang Anda butuhkan.
Saya harus mengatakan bahwa meskipun GCM memiliki kedua enkripsi dan integritas pesan, itu adalah desain yang sangat rapuh: jika Anda menggunakan kembali IV, Anda kacau - penyerang dapat memulihkan kunci Anda. Desain lain kurang rapuh, jadi saya pribadi takut untuk merekomendasikan GCM berdasarkan jumlah kode enkripsi yang buruk yang saya lihat dalam praktiknya.
Jika Anda membutuhkan keduanya, integritas pesan dan enkripsi, Anda dapat menggabungkan dua algoritma: biasanya kita melihat CBC dengan HMAC, tetapi tidak ada alasan untuk mengikat diri Anda dengan CBC. Yang penting untuk diketahui adalah mengenkripsi terlebih dahulu, lalu MAC konten yang dienkripsi , bukan sebaliknya. Juga, IV harus menjadi bagian dari perhitungan MAC.
Saya tidak mengetahui masalah IP.
Sekarang untuk hal-hal baik dari Profesor Rogaway:
Memblokir mode sandi, enkripsi tetapi tidak integritas pesan
ECB : Blockcipher, mode mengenkripsi pesan yang merupakan kelipatan dari n bit dengan secara terpisah mengenkripsi setiap bagian n-bit. Properti keamanan lemah , metode bocor kesetaraan blok di kedua posisi blok dan waktu. Dari nilai warisan yang cukup besar, dan nilai sebagai blok bangunan untuk skema lain, tetapi moda tersebut tidak mencapai tujuan keamanan yang secara umum diinginkan dalam haknya sendiri dan harus digunakan dengan sangat hati-hati; ECB tidak boleh dianggap sebagai mode kerahasiaan "tujuan umum" .
CBC : Skema enkripsi berbasis IV, mode aman sebagai skema enkripsi probabilistik, mencapai indistinguishability dari bit acak, dengan asumsi IV acak. Kerahasiaan tidak akan tercapai jika IV hanya merupakan nonce , atau jika nonce dienkripsi dengan kunci yang sama yang digunakan oleh skema, seperti yang disarankan oleh standar secara salah. Ciphertext sangat mudah ditempa. Tidak ada keamanan serangan ciphertext (CCA) yang dipilih. Kerahasiaan tidak dapat diperoleh jika ada ramalan bantalan yang benar untuk banyak metode bantalan. Enkripsi tidak efisien karena secara inheren serial. Banyak digunakan, properti keamanan mode-privasi mode ini sering menyebabkan penyalahgunaan. Dapat digunakan sebagai blok bangunan untuk algoritma CBC-MAC. Saya tidak dapat mengidentifikasi kelebihan penting dibandingkan mode CTR.
CFB : Skema enkripsi berbasis IV, mode aman sebagai skema enkripsi probabilistik, mencapai ketidakterbandingan dari bit acak, dengan asumsi IV acak. Kerahasiaan tidak tercapai jika IV dapat diprediksi , atau jika dibuat oleh nonce yang dienkripsi dengan kunci yang sama dengan yang digunakan oleh skema, seperti yang disarankan oleh standar secara salah. Ciphertext bisa ditempa. Tidak ada keamanan CCA. Enkripsi tidak efisien karena secara inheren serial. Skema tergantung pada parameter s, 1 ≤ s ≤ n, biasanya s = 1 atau s = 8. Tidak efisien untuk memerlukan satu panggilan blockcipher untuk hanya memproses bit s. Mode ini mencapai properti "sinkronisasi diri" yang menarik; penyisipan atau penghapusan sejumlah karakter s-bit ke dalam ciphertext hanya sementara mengganggu dekripsi yang benar.
OFB : Skema enkripsi berbasis IV, mode aman sebagai skema enkripsi probabilistik, mencapai indistinguishability dari bit acak, dengan asumsi IV acak. Kerahasiaan tidak tercapai jika IV adalah nonce, meskipun urutan tetap IVs (misalnya, penghitung) berfungsi dengan baik. Ciphertext sangat mudah ditempa. Tidak ada keamanan CCA. Enkripsi dan dekripsi tidak efisien karena secara inheren berseri. Mengenkripsi secara alami string dengan panjang bit apa pun (tidak diperlukan bantalan). Saya tidak dapat mengidentifikasi kelebihan penting dibandingkan mode CTR.
RKPT : Skema enkripsi berbasis IV, mode ini mencapai ketidakterbandingan dari bit acak dengan asumsi nonce IV. Sebagai skema berbasis nonce aman, mode ini juga dapat digunakan sebagai skema enkripsi probabilistik, dengan IV acak. Kegagalan total privasi jika nonce digunakan kembali pada enkripsi atau dekripsi. Paralelabilitas mode sering membuatnya lebih cepat, dalam beberapa pengaturan jauh lebih cepat, daripada mode kerahasiaan lainnya. Blok bangunan penting untuk skema enkripsi terotentikasi. Secara keseluruhan, biasanya cara terbaik dan paling modern untuk mencapai enkripsi privasi saja.
XTS : Skema enkripsi berbasis IV, mode bekerja dengan menerapkan blockcipher tweakable (aman sebagai PRP kuat) untuk setiap potongan n-bit. Untuk pesan dengan panjang tidak dapat dibagi oleh n, dua blok terakhir diperlakukan secara khusus. Satu-satunya penggunaan mode yang diizinkan adalah untuk mengenkripsi data pada perangkat penyimpanan terstruktur-blok. Lebar sempit PRP yang mendasarinya dan perawatan blok akhir fraksional yang buruk adalah masalah. Lebih efisien tetapi kurang diinginkan daripada blockcipher PRP (secure-block) aman.
MAC (integritas pesan tetapi bukan enkripsi)
ALG1–6 : Kumpulan MAC, semuanya berdasarkan CBC-MAC. Terlalu banyak skema. Beberapa terbukti aman sebagai VIL PRF, beberapa sebagai FIL PRF, dan beberapa tidak memiliki keamanan yang terbukti. Beberapa skema mengakui serangan merusak. Beberapa mode diberi tanggal. Pemisahan kunci tidak cukup diperhatikan untuk mode yang memilikinya. Seharusnya tidak diadopsi secara massal, tetapi secara selektif memilih skema "terbaik" adalah mungkin. Akan lebih baik untuk tidak mengadopsi mode-mode ini, mendukung CMAC. Beberapa MAC ISO 9797-1 distandarisasi dan digunakan secara luas, terutama di perbankan. Versi standar revisi (ISO / IEC FDIS 9797-1: 2010) akan segera dirilis [93].
CMAC : MAC yang didasarkan pada CBC-MAC, modenya terbukti aman (sampai batas ulang tahun) sebagai (VIL) PRF (dengan asumsi blockcipher yang mendasari adalah PRP yang baik). Pada dasarnya biaya minimum untuk skema berbasis CBCMAC. Sifat serial serial masalah dalam beberapa domain aplikasi, dan penggunaan dengan blockcipher 64-bit akan membutuhkan penguncian ulang sesekali. Lebih bersih dari koleksi ISO 9797-1 MAC.
HMAC : MAC yang didasarkan pada fungsi hash kriptografi dan bukan blockcipher (meskipun sebagian besar fungsi hash kriptografis itu sendiri didasarkan pada blockciphers). Mekanisme menikmati batas keamanan yang dapat dibuktikan kuat, meskipun tidak dari asumsi yang lebih disukai. Berbagai varian yang berkaitan erat dalam literatur mempersulit untuk mendapatkan pemahaman tentang apa yang diketahui. Tidak ada serangan merusak yang pernah disarankan. Banyak terstandarisasi dan digunakan.
GMAC : MAC berbasis nonce yang merupakan kasus khusus GCM. Mewarisi banyak karakteristik baik dan buruk GCM. Tetapi persyaratan nonce tidak diperlukan untuk MAC, dan di sini ia membeli sedikit manfaat. Serangan praktis jika tag dipotong ke ≤ 64 bit dan tingkat dekripsi tidak dipantau dan dikurangi. Kegagalan total pada nonce-reuse. Penggunaan tetap tersirat jika GCM diadopsi. Tidak direkomendasikan untuk standardisasi terpisah.
enkripsi terotentikasi (enkripsi dan integritas pesan)
CCM : Skema AEAD berbasis non yang menggabungkan enkripsi mode CTR dan CBC-MAC mentah. Serial, membatasi kecepatan dalam beberapa konteks. Terbukti aman, dengan batas yang baik, dengan asumsi blockcipher yang mendasarinya adalah PRP yang baik. Konstruksi tidak bijaksana yang terbukti melakukan pekerjaan. Lebih mudah diimplementasikan daripada GCM. Dapat digunakan sebagai MAC berbasis nonce. Banyak terstandarisasi dan digunakan.
GCM : Skema AEAD berbasis non yang menggabungkan enkripsi mode CTR dan fungsi hash universal berbasis GF (2128). Karakteristik efisiensi yang baik untuk beberapa lingkungan implementasi. Hasil yang terbukti aman-aman dengan asumsi pemotongan tag minimal. Serangan dan batas keamanan yang dapat dibuktikan buruk dengan adanya pemotongan tag yang substansial. Dapat digunakan sebagai MAC berbasis nonce, yang kemudian disebut GMAC. Pilihan yang dipertanyakan untuk mengizinkan nonces selain 96-bit. Rekomendasikan batasi nonces ke 96-bit dan tag setidaknya 96 bit. Banyak terstandarisasi dan digunakan.
sumber
sumber
Sudahkah Anda mulai dengan membaca informasi ini di Wikipedia - Blok mode operasi cipher ? Kemudian ikuti tautan referensi di Wikipedia ke NIST: Rekomendasi untuk Mode Operasi Blok Cipher .
sumber
Anda mungkin ingin memilih berdasarkan apa yang tersedia secara luas. Saya memiliki pertanyaan yang sama dan ini adalah hasil dari penelitian terbatas saya.
Keterbatasan perangkat keras
Keterbatasan sumber terbuka
[1] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Gunakan-AES-Library
[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip
sumber
Saya tahu satu aspek: Meskipun CBC memberikan keamanan yang lebih baik dengan mengubah IV untuk setiap blok, itu tidak berlaku untuk mengakses konten terenkripsi secara acak (seperti hard disk terenkripsi).
Jadi, gunakan CBC (dan mode sekuensial lainnya) untuk aliran sekuensial dan ECB untuk akses acak.
sumber