Tentang metode otentikasi yang sangat mata-mata

Jadi, kami mengirim agen super rahasia Alice dan Bob ke negara musuh yang menyamar. Selama misi, mereka harus menghubungi dan bekerja bersama, bertukar informasi, urusan spionase biasa. Tentu saja, semua ini harus dilakukan sesuai dengan semua aturan dan prosedur keselamatan yang memungkinkan.


Memang, pada gilirannya terakhir, kami ingin mengungkapkan mereka: baik misi itu sendiri dan agen itu sendiri dan semua keamanan nasional beresiko. Karena itu, kepentingan kami adalah memberikan informasi minimal yang diperlukan bagi mata-mata. Secara khusus, semakin sedikit yang mereka ketahui tentang satu sama lain dan teknik komunikasi, semakin baik.


Tetapi bagaimana mereka mengidentifikasi kawan markas mereka?


KDPV


TL; DR - menemukan mekanisme otentikasi pengguna menggunakan steganografi untuk agensi tiga karakter imajiner dari negara yang tidak ada.


Tentang serigala dan kulit domba


Penutup adalah penutup, jadi Alice atau Bob tidak boleh menimbulkan kecurigaan dengan tindakan mereka. Perencanaan yang tepat menyiratkan paranoia tentang pemantauan konstan mereka di semua tingkatan yang memungkinkan. Posting ini tidak akan membahas tugas pertukaran informasi secara langsung (layak mendapatkan seri terpisahnya sendiri), tetapi hanya cara untuk memastikan bahwa informasi tersebut dikirimkan oleh mereka yang membutuhkannya kepada siapa pun yang membutuhkannya.


Kemungkinan besar, kedua mata-mata akan memiliki sejarah dalam format warga biasa, apalagi, tidak terhubung satu sama lain. Oleh karena itu, Anda harus segera memveto penggunaan alat kriptografi klasik dan saluran aman - setiap agen kontra intelijen tahu bahwa orang jujur ​​yang tidak memiliki koneksi dekat tidak perlu disembunyikan.


Apa yang harus dilakukan


Tentu saja, tugas seperti itu bukanlah hal baru, itu ada dengan gembira dan telah dipecahkan jauh sebelum munculnya ini dari Internet Anda. Dan tidak hanya telah diputuskan, jadi beberapa keputusan telah diperkuat dalam budaya dan masih ditemukan di buku, film, dan permainan.


Mari kita lihat pemandangan seperti itu: dua orang berjaket panjang berkumpul di tempat umum dan bertukar kalimat yang sangat aneh. Jika frasa dan jawaban awal benar, maka otentikasi berhasil, dan orang-orang bertukar folder bertanda "Top Secret" dan menyimpang ke arah yang tidak diketahui.


Kerugian dari skema semacam itu segera jelas - frasa harus dirahasiakan dan sering diubah , yang tidak terlalu sederhana di wilayah musuh. Pada saat yang sama, agar tidak diucapkan secara kebetulan dan tidak mengarah pada kasus KDPV, mereka menjadi sangat menonjol dan acak, yang berarti bahwa mereka dapat memberikan agen yang mengucapkannya.



Kami, di era teknologi digital, tidak menyukai metode ini. Terutama jika Anda ingat bahwa hampir semua saluran komunikasi dikendalikan oleh seseorang dan disadap karena motif baik dan buruk. Dan apa pun yang mereka meyakinkan kami, kehidupan orang-orang tidak boleh dipercaya dalam kebijakan privasi Facebook mana pun.



Steganografi (lagi?)


Landak jelas bahwa kemampuan untuk bersembunyi satu sama lain dalam situasi seperti itu terlihat lebih menarik dari sebelumnya. Dan pada kenyataannya, bahkan metode yang dijelaskan adalah subspesiesnya - frasa kode dapat dianggap sebagai wadah dengan hanya sedikit informasi di dalamnya.


Mamalia yang sama dari detasemen insektivora memahami bahwa ini bukan hanya tentang saling melemparkan stegocontainers. Pertukaran semacam itu akan menyebabkan kecurigaan yang hampir lebih besar daripada beberapa enkripsi PGP yang umum, jadi kami tidak tertarik.


Bagaimana dengan itu?


Tidak seperti cryptograms, stegocontainers memiliki keunggulan yang jelas - konteks aplikasi. Setiap teks, gambar, file audio, dll., Selain konten yang jelas, juga membawa kemungkinan diskusi alami dan dapat dikirim tidak hanya dari teluk, tetapi dalam proses dialog yang tidak menimbulkan kecurigaan.


Dipersenjatai dengan ide-ide seperti itu, kita sudah dapat menyusun protokol otentikasi steganografi sederhana berdasarkan kunci umum:


  • A -> B: pesan cantik yang meminta wadah steganografi parameter tertentu;
  • B: memilih wadah C yang cocok dengan konteks dan parameter yang diminta;
  • B: sama menciptakan pesan M ;
  • B -> A: C '= Sematkan (C, M, K) ;
  • A: Cek C ' untuk kepatuhan dengan parameter yang ditetapkan;
  • A -> B: M '= Ekstrak (C', K) ;
  • B: Cek apakah M dan M cocok.

Protokol semacam itu memiliki kelemahan yang jelas - Alice dan Bob harus memiliki kunci bersama dan fungsi embedding dan ekstraksi. Kompromi mereka dapat mengarah pada kemungkinan analisis terperinci tentang metode otentikasi musuh dan membahayakan pengguna dan markas lainnya. Sesuatu harus diperbaiki.


Artis itu bukan bug


Jika pembaca pergi ke sekolah setelah munculnya kelas-kelas komputer, maka ia harus ingat belajar dasar-dasar algoritmaisasi menggunakan pemain kura-kura, semut dan sejenisnya. Gagasan mereka adalah untuk menunjukkan kemungkinan mengoptimalkan sejumlah besar tindakan tunggal manual dengan membuat program sederhana. Untuk menyelesaikan masalah kita, kita harus pergi ke arah yang berlawanan.


Bukankah itu lucu?


Karena kita dapat menyederhanakan penulisan algoritma akhir dari urutan langkah ke deskripsi prosedural mereka sesuai dengan parameter yang diberikan, kita dapat melakukan proses inversi. Jika Anda membayangkan sebuah wadah sebagai array dari beberapa komponennya, maka menyematkan pesan dengan kunci dapat ditulis sebagai urutan operasi yang terurut pada elemen kontainer pada indeks tertentu dengan berbagai parameter konstan.


Di sinilah non-matematika dimulai, jadi saya meminta yang pemalu untuk hanya membalik paragraf yang tampak sulit ke bagian operasi atau bahkan sedikit lebih jauh. Tidak ada yang mengerikan akan terjadi, aku janji.


Untuk menanamkan data, kita perlu urutan bentuk: (f1, S1, i, D1), (f2, S2, j, D2) ... , di mana:


  • Di - beberapa bagian dari data yang disematkan;
  • i, j adalah indeks unsur-unsur wadah;
  • fi: (Negara, Elemen, D) -> (Negara, Elemen) - fungsi sematan;
  • Si adalah keadaan tertentu, konteks operasi, (El ', S [i + 1]) = fi (Si, El, Di) .

Untuk mengekstraknya, Anda tidak perlu menyimpan bagian data (K.O), karena itu ada cukup tiga kali lipat: (g1, S1, I1), (g2, S2, I2) ... dengan nilai yang sama, hanya gi: (Negara, Elemen) -> (Negara, D) .


Semua ini dapat diwakili oleh diagram simetris di bawah ini. Jika karena alasan tertentu saya tidak berhasil mencapai kejelasan, maka itu tidak menakutkan, baca terus.


Baik atau tidak lagi


Dapat dilihat bahwa fungsi penyematan memiliki tingkat kebebasan yang lebih besar. Tidak seperti saudara perempuannya, dia memodifikasi wadah, sambil melakukan ini berdasarkan dua elemen independen - data tertanam dan elemen. Terima kasih, atau, lebih tepatnya, karena ini, dua pendekatan global untuk penerapan algoritma steganografi oleh sistem seperti itu dimungkinkan:


  1. Pilih indeks elemen yang paling tepat untuk diubah sesuai dengan fungsi embedding (paling tidak terlihat atau tidak memerlukannya sama sekali) dan transfer urutan yang terbentuk terkait dengan wadah tertentu. Dengan pendekatan ini, mereka perlu diisolasi satu sama lain sebelum muncul kebutuhan untuk menggunakan metode klasik seperti enkripsi dan media aman lainnya;
  2. Temukan metode membagi wadah menjadi elemen dan fungsi penyisipan sehingga setiap perubahan yang diharapkan akan sama tidak terlihat. Dalam hal ini, urutannya tidak tergantung pada wadah dan dapat dibuat bahkan oleh generator yang sepenuhnya acak. Kurang fleksibel dan kurangnya kontrol kasus terburuk. Di sisi lain, pendekatan ini lebih sederhana dan lebih nyaman ketika diterapkan di lapangan, jadi di bawah ini saya akan menggunakannya.

Jika status tidak diperlukan untuk algoritme, maka semua hal di atas tetap valid, hanya tanpa satu huruf dan blok pada diagram. Tanpa itu, sebenarnya lebih mudah.


Dan mengapa kita membutuhkannya?


Sekarang, jika Anda tahu sebelumnya wadah mana dengan pesan dan kunci mana yang akan digunakan, alih-alih sepenuhnya mengungkapkan bagian-bagian dari algoritma, Anda dapat menghasilkan dan memberikan agen untuk hanya menggunakan urutan dan juru bahasa seperti itu. Baiklah, tidak hanya memberi, tentu saja, tetapi lebih banyak tentang itu nanti.


Tambahkan asimetri


Bahkan seorang seniman kura-kura dapat menggambar kotak dengan ratusan cara berbeda, cukup mengubah urutan operasi dan menambahkan yang baru. Ini berarti bahwa tidak ada yang mengganggu kami dan melakukan hal yang sama dengan urutan yang dijelaskan untuk data input tetap.


Artinya, kita dapat mengambil urutan penyematan, menambahkan operasi baru, mencampur semuanya, dan agar hasilnya tetap sama. Kecuali, di hadapan suatu negara, akan perlu untuk melacaknya dan menambahkan secara terpisah perubahan yang diperlukan untuk urutan. Itu sebabnya tanpanya lebih mudah, ya.


Dengan satu dan lain cara, setelah diremas-remas dan berisik, bahkan pembuat embedder itu sendiri tidak akan lagi dapat memahami apa yang sebenarnya ia tanamkan: setiap urutan operasi N akan mewakili N! pesan yang berpotensi tertanam - satu untuk setiap permutasi dari bagian yang tertanam. Pada saat yang sama, N sendiri adalah pertanyaan besar. Oleh karena itu, seseorang dapat memanggil urutan seperti itu terbuka - mereka tidak memberikan informasi apa pun baik tentang pesan yang disematkan, maupun tentang algoritma dan kunci yang digunakan.


Saat mengekstraksi informasi, sangat penting bagi kami baik urutan (untuk mengembalikan pesan yang benar sama dari semua kemungkinan) dan jumlah bagian yang akan diekstraksi, sehingga urutan ekstraksi tetap tidak berubah dari saat kelahiran. Karena mereka secara implisit mengandung informasi tentang kunci, generator dan algoritma yang digunakan, mereka, seperti hewan dari buku merah, perlu disimpan dan dilindungi. Dan merahasiakannya.


Apa hubungannya asimetri dengan itu? Faktanya adalah bahwa sekarang setiap urutan ekstraksi dikaitkan dengan jumlah embedder yang tak terbatas. Dan memulihkan satu dari yang lain, dalam kasus umum, adalah tugas yang tidak terpecahkan.


Kami sedang beroperasi


Kami lupa tentang matematika dekat dan kembali ke tugas semula - bagaimana kita bisa mengirim Alice dan Bob ke wilayah musuh untuk:


  • mereka tidak saling kenal satu sama lain
  • tidak memiliki algoritma rahasia di tangan
  • tetapi bisakah Anda memverifikasi satu sama lain saat berkomunikasi di saluran terbuka?

Nah, dengan paragraf pertama semuanya jelas, kami hanya tidak memberi mereka informasi eksplisit tentang satu sama lain, tidak ada kunci bersama. Untuk yang kedua, Anda perlu mengingat deskripsi protokol di atas. Sekarang kita dapat mengecualikan secara langsung algoritma Embed dan Extract yang mewakili potensi rahasia negara dan semua itu. Dan, dengan mempertimbangkan ini, untuk yang ketiga dimungkinkan untuk membuat protokol dua tahap berikut.


Pembuatan informasi otentikasi sebelum dimulainya misi dengan kantor pusat sebagai pihak tepercaya dari Trent:


  • T: memilih algoritma rahasia dan kunci rahasia K, dibuat dengan bantuan mereka:
    • Ekstrak urutan Ex ;
    • cocok untuk otentikasi (di bawah) konteks Ctx ;
  • T -> A: Ctx, Ex ;
  • T: menggunakan Ex dan konteks yang dibuat, menghasilkan:
    • pesan M sebelumnya tidak digunakan untuk agen yang dipilih dari antara bagian | Ex | ;
    • urutan satu kali Em , membuatnya terbuka seperti dijelaskan di atas;
  • T -> B: Em, h (M) , jika diinginkan, membuat set tambahan.

Dengan demikian, Alice hanya memiliki satu urutan untuk semua kesempatan dan konteks kontak di masa depan, dan Bob menjadi pemilik yang bahagia dari serangkaian urutan dan hash pesan satu kali yang mereka tanam.


Protokol otentikasi yang sudah ada selama misi terlihat seperti ini:


  • A -> B: pesan IM awal berdasarkan konteks Ctx dengan deskripsi wadah;
  • B: memilih C ~ IM yang sesuai;
  • B -> A: C '= Em (C) ;
  • A: memeriksa kepatuhan dengan C '~ IM (karena perubahan tidak terlihat, itu harus disimpan);
  • A -> B: M '= Ex (C') , menandai M 'saat digunakan;
  • B: cek, h (M ') == h (M) , hancurkan Em, h (M) .

Pembaca yang penuh perhatian akan memperhatikan bahwa sebelum protokol, Alice dan Bob hanya memiliki satu set informasi, yang dengan sendirinya tidak berarti apa-apa bagi mereka, atau bagi musuh potensial, dan hanya selama "bermain dengan warna".


Setiap set terbuka Bob hanya digunakan sekali, yang dikendalikan oleh langkah kedua dari belakang Alice. Ketika bertemu M yang sebelumnya digunakan (dan, karena itu, Em tak terlihat olehnya) oleh orang lain, dia menyadari bahwa salah satu "rekan" -nya adalah palsu.


Penggunaan berulang oleh orang yang sama memberi tahu dia bahwa dia tidak mengetahui seluk-beluk protokol dan tentu saja bukan orang yang harus dihubungi. Yah, lebih baik terlambat daripada tidak sama sekali.



Oke, beginilah semuanya terlihat terlalu rumit dan sulit dipahami. Adakah yang datang?


Mari kita tunjukkan lebih baik dalam praktik, karena bahkan mata-mata itu sendiri tidak perlu mengetahui rincian protokol untuk digunakan, apalagi pembaca yang buruk. Awalnya hanya sedikit tentang bagaimana itu semua diterapkan.


Teknologi tinggi


Jadi, tetap hanya menulis semua yang diperlukan untuk protokol. Ya, Anda tidak melakukan segalanya dengan tangan Anda (meskipun Anda bisa). Dan hari ini korban kode saya akan ... memutar roda keberuntungan ... Jawa? Baiklah, pada saat yang sama segala sesuatu di STL akan, Anda tidak perlu mencari apa pun.


Mari kita mulai dengan API yang diperlukan. Untuk bekerja, Anda hanya perlu menentukan kelas array elemen kontainer dengan kemampuan untuk menerima dan mengubah elemen berdasarkan indeks:


class MyContainer implements StegoContainer<MyElement> { public MyElement get(int i) { //  i-  } public void set(int i, MyElement v) { //  i-  } public int size() { //    } } 

Penggunaan lebih lanjut dikurangi untuk membuat pembungkus otomat steganografi di atas wadah yang diperlukan dan memasok fungsi embedding dan ekstraksi ke inputnya:


 StegoMachine<MyState, MyElement> myMachine = new StegoMachine( initialState, new MyContainer<MyElement>(/*   */) ); final StegoEmbed myEmbed = (st, el, dp) -> { //    dp   el   st }; final StegoExtract myExtract = (st, el) -> { //     el   st return dp; }; //    MyDataPart part = /*    */; myMachine.exec(1337, myEmbed, part); //... //    /,   //      State currState = myMachine.getState(); //... //    part = myMachine.exec(80085, myExtract); //... //        MyContainer container = (MyContainer) myMachine.getContainer(); 

Kelas dengan akhiran Stateless digunakan dengan cara yang sama, jika implementasi algoritma tidak memerlukan mempertahankan keadaan internal.


Generator urutan dapat bekerja sesuka Anda dan tidak memiliki API umum. Dalam kasus umum, apa pun dapat menjadi bagian dari data secara umum, mulai dari bit tunggal hingga rock art dalam pengkodean terpisah.


Contoh implementasi


Tentang Metode


Sebagai contoh implementasi, menggunakan antarmuka yang dibuat, saya menerapkan algoritma sederhana dari keluarga LSB untuk gambar bitmap dengan kompresi lossless. Elemen-elemen mereka adalah piksel yang tidak memiliki tetangga dalam bit paling signifikan dari semua komponen RGB. Fungsi embed bekerja dengan bit tunggal dari data sumber dan hanya mengubah bit orde rendah dari nilai salah satu komponen (yang indeks akan arahkan ke).


Ini cukup sederhana, tetapi sangat bagus untuk mengimplementasikan protokol, karena mengubah elemen apa pun sama-sama tidak terlihat menurut pilihan mereka, sehingga indeks elemen yang akan diubah dihasilkan menggunakan generator acak. Dalam kasus Java, menggunakan SecureRandom , tetapi jika diinginkan, ia dengan mudah berubah ke sumber entropinya.


Namun demikian, ini adalah metode yang sangat sederhana, saya tidak merekomendasikan menggunakannya untuk mata-mata nyata.


Tentang hash


Karena teks cenderung terdistorsi tergantung pada kepribadian agen yang disimulasikan (beberapa tidak memasukkan huruf kapital, yang lain suka membuat emotikon, dll., Yang lain umumnya buta huruf), saya sarankan menggunakan sha256 untuk menghitung hash, tetapi hanya dari kata-kata yang dicetak huruf kecil:


 h("Hello world?...") == h("hello, world!11") 

Tentang antarmuka


Paket perangkat lunak terdiri dari dua bagian - satu untuk menghasilkan urutan dan hash lainnya untuk Trent, yang lain untuk menanamkan dan memeriksa pesan yang diterima untuk kepatuhan.


Bekerja dengan keduanya terjadi dari baris perintah melalui argumen dan aliran input-output, tidak ada antarmuka lain yang disampaikan (ketakutan dan horor). Tetap saja, untuk menjadi karyawan markas itu, mata-mata itu - artinya memiliki semacam kualifikasi. Nah, jika tidak, saya masih akan menunjukkan contoh.


Ini bantuannya

Tangkapan layar penggunaan



Apa yang mereka lakukan?


Untuk memulainya, Trent di kantor pusat perlu mengerjakan informasi otentikasi. Khususnya, untuk memikirkan terlebih dahulu situasi di mana agen akan bekerja.


Misalnya, biarkan Bob menjadi freelancer grafis dan Alice sebagai pelanggannya. Otentikasi akan berlangsung dengan kedok perintah untuk membuat grafik / desain / sesuatu yang lain.


Kami melaporkan informasi yang bermanfaat ini kepada keduanya dan kembali ke protokol itu sendiri. Kami akan menyiapkan pesan tertanam M.txt yang sesuai terlebih dahulu , meminimalkan jumlah karakter di dalamnya: "itu cocok untuk saya di mana mentransfer uang." Hasilkan Em dan Ex menggunakan utilitas untuk Trent:


 Trent@HQWorkstation:~$ java -jar HQUtil.jar -ex $(stat -c%s "M.txt") 4096 > Ex.txt Trent@HQWorkstation:~$ cat Ex.txt | java -jar HQUtil.jar -em "$(cat M.txt)" 0.25 4096 > Em.txt Trent@HQWorkstation:~$ cat M.txt | java -jar HQUtil.jar -h > hash.bin 

Di sini $(stat -c%s "M.txt") mengembalikan ukuran pesan dalam byte, dan 4096 - pembatasan pada kisaran indeks yang dihasilkan (untuk memungkinkan penggunaan wadah yang lebih kecil). Demikian pula, $(cat M.txt) digunakan untuk meneruskan pesan itu sendiri ke parameter baris perintah. Pada prinsipnya, Anda dapat melakukannya tanpa bash, menggunakan tenaga manual Anda sendiri, tetapi kepada siapa itu lebih nyaman.


Ex.txt diteruskan ke Alice, Em.txt dan hash.bin ke Bob. Sekarang bayangkan agen telah berhasil dikerahkan dan ingin berkomunikasi satu sama lain - kami melanjutkan ke pelaksanaan protokol. Bob menempatkan resumenya atau tawaran pekerjaan pada suatu pertukaran, dan Alice memulai komunikasi:


 : ,     %_% :        ,   .  ? : ,    

Bob mencari gambar payung, bahkan mungkin menggambarnya sendiri jika arwahnya kreatif, sedikit mengompres / memaksakan tanda air (atau apa yang dilakukan freelancer di sana sekarang) dan melakukannya:


 Bob@PC:~$ cat Em.txt | java -jar SpyUtil.jar -e umbrella.png 

Setelah menunggu beberapa saat, pura-pura bekerja, jika dalam kenyataannya dia tidak melakukannya, dia mengirimkan Alice wadah yang diterima, tentu saja, mengingat konteksnya:


 : ,  ,      

Mengirimkan payung dengan pesan, 670kb


Itu, pada gilirannya, mengambil pesan yang disimpan secara internal:


 Alice@PC:~$ cat Ex.txt | java -jar SpyUtil.jar -e umbrella.png       

Mengubah satu set kata menjadi kalimat normal dan mengirimkannya ke Bob:


 : ,  ,   ? 

Ia memeriksa keakuratan pesan:


 Bob@PC:~$ java -jar SpyUtil.jar -c hash.bin ",  ,   ?" ,  ,   ? - Correct 

Dan komunikasi terus mudah, jika semuanya OK. Seluruh dialog pada bagian pengamat terlihat seperti ini:


500 kilobyte gif


Jelas bahwa kontra intelijen tidak akan menemukan sesuatu yang mencurigakan dalam semua yang disadap ini. Bahkan, bahkan metode analisis stego dalam kasus ini tidak akan selalu diterapkan - well, seseorang memesan gambar payung seharga 5 dolar, mereka menemukan sesuatu yang mengejutkan Internet. Sumber daya komputasi dan orang tidak terbatas untuk memeriksa setiap situasi seperti itu. Otentikasi berhasil, tirai.


-> github

Source: https://habr.com/ru/post/id456670/


All Articles