it-swarm-id.com

Apakah enkripsi simetris memberikan integritas data?

Katakanlah saya memiliki satu server yang mengenkripsi file dengan kunci simetris, mis. AES-CBC, dan mengirimkannya ke klien yang mendekripsi itu. Apakah itu memberikan integritas data saat didekripsi? Atau mungkinkah seseorang merusak file saat masih dienkripsi, dan kemudian ketika klien mendekripsi, menghasilkan file yang dimodifikasi?

Saya biasanya melihat integritas dan keaslian data dibahas dalam hal menggunakan tanda tangan digital atau MAC, tetapi tidak pernah dalam konteks enkripsi. Saya juga melihat benchmark yang menunjukkan enkripsi lebih mahal daripada hashing, tapi itu bukan pertimbangan utama saya.

PEMBARUAN

Saya mencoba percobaan, di mana saya menggunakan alat openssl di Linux untuk mengenkripsi file. Kemudian, saya mencoba memodifikasi file dengan berbagai cara (mengubah byte, menghapus byte, menambahkan byte). Dalam setiap kasus, ketika saya mencoba mendekripsi, saya akan mendapatkan pesan "dekripsi buruk". Perintah yang saya gunakan adalah:

openssl enc -aes-128-cbc -in test -out test.enc
openssl enc -d -aes-128-cbc -in test.enc -out test.dec
18
88keys

Enkripsi simetris tidak tidak memberikan integritas. Jumlah kontrol yang dapat dimiliki penyerang pada data yang dienkripsi tergantung pada jenis enkripsi; dan beberapa perincian spesifik dari beberapa mode enkripsi dapat membuat hidup sedikit lebih sulit bagi penyerang jika dia ingin melakukan modifikasi bedah. Dengan CBC, penyerang dapat membalik bit apa pun yang dia inginkan, asalkan dia tidak keberatan mengubah selusin byte lainnya menjadi sampah acak.

Ada mode enkripsi terbar yang menggabungkan enkripsi simetris dan integritas yang diperiksa (dengan MAC ). Mode-mode ini memastikan kerahasiaan dan integritas. AES-CBC adalah not salah satunya. Jika Anda menginginkan mode enkripsi dengan integritas, saya sarankan EAX .

Pembaruan: tentang percobaan Anda: CBC adalah mode di mana panjang data sumber harus merupakan kelipatan dari panjang blok blok sandi sandi (16 byte, untuk AES) . Karena pesan input sewenang-wenang dapat memiliki panjang apa pun, beberapa padding ditambahkan: beberapa byte, dengan konten tertentu sedemikian sehingga mereka dapat dihapus secara ambigu saat didekripsi. Dalam kasus Anda, OpenSSL mengeluh bahwa, setelah dekripsi, ia tidak menemukan struktur pengisi yang tepat. Namun, jika penyerang tidak mengubah 32 byte terakhir dari data terenkripsi, padding akan tidak rusak, jadi perubahan semua kecuali 32 byte terakhir akan tetap tidak terdeteksi. Dan bahkan untuk 32 byte terakhir, ada cara untuk menghindari deteksi dengan probabilitas yang tidak terlalu kecil.

19
Tom Leek

Enkripsi CBC tidak memberikan integritas data. Inilah alasannya:

Perbaiki beberapa kunci k (tidak diketahui penyerang). Biarkan E (k, -) dan D (k, -) menjadi fungsi enkripsi dan dekripsi kosong dari beberapa cipher blok. Biarkan p menjadi beberapa blok plaintext. Saya akan menyatakan XOR oleh +. Setelah memperbaiki beberapa IV, kami mengenkripsi sebagai berikut:

c = E (k, p + IV).

Kemudian, kami mengirim IV dan c melalui kabel. Untuk mendekripsi, kami menghitung

p = D (k, c) + IV.

(Perhatikan bahwa ini setara dengan pernyataan D (k, c) = IV + p.)

Sekarang, anggaplah seorang penyerang tahu satu pasangan plaintext/ciphertext. Mari kita tunjukkan sebagai p dan (IV, c), seperti di atas. Sekarang, anggap bahwa penyerang ingin membuat ciphertext yang akan mendekripsi ke beberapa blok plaintext lain yang ia pilih - katakan p '. Saya mengklaim bahwa (IV + p + p ', c) mendekripsi ke p'. Mengapa?

Baiklah, kita ikuti saja prosedur dekripsi di atas, ganti IV dengan IV + p + p '. Kita punya

D (k, c) + (IV + p + p ') = (IV + p) + (IV + p + p') = p '.

Yang mengherankan, mode-ECB tidak rentan terhadap masalah ini (meskipun saya juga tidak mendukung penggunaannya).

12
iamtheneal

Enkripsi AES-CBC tidak memberikan integritas. Bergantung pada bagaimana itu diterapkan dan digunakan, itu mungkin terjadi untuk mendeteksi beberapa modifikasi yang tidak disengaja pada ciphertext, tetapi ia tidak bertahan terhadap perusakan berbahaya yang merusak ciphertext. .

Enkripsi tanpa otentikasi adalah salah satu kesalahan paling umum dalam penggunaan kriptografi . Ini telah menyebabkan kerentanan serius di banyak sistem, termasuk ASP.NET, enkripsi XML, Amazon EC2, JavaServer Faces, Ruby on Rails, OWASP ESAPI, IPSEC, dan WEP. Lihat tautan sebelumnya untuk informasi lebih lanjut.

Cara mengatasinya: Anda harus menggunakan skema enkripsi terotentikasi (bukan AES-CBC), seperti EAX, atau Anda harus menggunakan kode otentikasi pesan, seperti CMAC, dalam mode enkripsi-lalu-otentikasi.

Jika Anda akan menerapkan kriptografi sendiri, saya mendorong Anda untuk membaca pertanyaan di sini --- Pelajaran yang dipelajari dan kesalahpahaman tentang enkripsi dan kriptologi untuk membantu Anda menghindari beberapa kesalahan paling umum. Menggunakan enkripsi tanpa otentikasi adalah salah satunya.

9
D.W.

Cipher simetris tidak dengan sendirinya memberikan integritas karena mereka tidak mendeteksi modifikasi berbahaya atau tidak sengaja pada ciphertext; dekripsi akan menghasilkan sesuatu selain plaintext asli dan kecuali jika ini menghasilkan beberapa pelanggaran protokol untuk payload didekripsi maka Anda memiliki masalah integritas.

Solusinya adalah dengan membungkus plaintext di dalam paket yang menyertakan data yang dapat digunakan untuk memvalidasi integritas paket, biasanya checksum berbasis hash ( edit: HMAC kunci). Inilah yang dilakukan mis. untuk Transport Layer Security.

Berikut adalah contoh skema perlindungan plaintext yang digunakan dalam protokol transport byte aman Platform Versile (disclaimer: Saya terlibat dalam pengembangan VP).

Edit: Saya menyadari bahwa enkapsulasi pesan terlalu banyak untuk skenario Anda yang melibatkan file lengkap, dan jadi Anda lebih baik hanya menambahkan MAC kunci pada lengkap ciphertext. Untuk format yang dilindungi paket, seperti D.W. menunjukkan rincian masalah, dan "checksum" harus dilakukan sebagai MAC yang dikunci.

5
Versile