Anda perlu memeriksa apakah teman Anda, Bob, memiliki nomor telepon yang benar, tetapi Anda tidak dapat menanyakannya secara langsung. Anda harus menulis pertanyaan pada kartu yang mana dan memberikannya kepada Hawa yang akan membawa kartu itu kepada Bob dan mengembalikan jawabannya kepada Anda. Apa yang harus Anda tulis di kartu, selain pertanyaan, untuk memastikan Bob dapat menyandikan pesan sehingga Eve tidak dapat membaca nomor telepon Anda?
Catatan: Pertanyaan ini ada di daftar "pertanyaan wawancara google". Akibatnya, ada banyak versi pertanyaan ini di web, dan banyak dari mereka tidak memiliki jawaban yang jelas, atau bahkan benar.
Catatan 2: Jawaban snarky untuk pertanyaan ini adalah bahwa Bob harus menulis "panggil aku". Ya, itu sangat pintar, 'di luar kotak' dan segalanya, tetapi tidak menggunakan teknik apa pun di bidang CS tempat kami memanggil pahlawan kami "Bob" dan musuhnya yang menguping "Eve".
Pembaruan:
Poin bonus untuk algoritme yang Anda dan Bob bisa tangani dengan cukup baik.
Pembaruan 2:
Perhatikan bahwa Bob tidak harus mengirimi Anda pesan sewenang-wenang, tetapi hanya mengkonfirmasi bahwa ia memiliki nomor telepon Anda yang benar tanpa Hawa bisa memecahkan kode itu, yang mungkin atau mungkin tidak mengarah ke solusi yang lebih sederhana.
Jawaban:
Pertama, kita harus berasumsi bahwa Hawa hanya pasif. Maksud saya, dia dengan jujur mengirim kartu itu kepada Bob, dan apa pun yang dia bawa kembali ke Alice adalah jawaban Bob. Jika Eve dapat mengubah data di salah satu atau kedua arah (dan tindakannya tetap tidak terdeteksi) maka apa pun berjalan.
(Untuk menghormati tradisi lama, dua pihak yang jujur yang terlibat dalam percakapan disebut Alice dan Bob. Dalam teks Anda, Anda mengatakan "Anda". Nama asli saya bukan "Alice", tetapi saya akan merespons seperti jika Anda menulis bahwa Alice ingin memverifikasi nomor telepon Bob.)
Jawaban sederhana (tapi lemah) adalah menggunakan fungsi hash. Alice menulis di kartu: "kembalikan kepadaku hash SHA-256 dari nomor teleponmu". SHA-256 adalah fungsi hash kriptografis yang diyakini aman, sejauh fungsi hash berjalan. Menghitungnya dengan tangan akan membosankan tetapi masih bisa dilakukan (itu sekitar 2.500 operasi 32-bit, di mana setiap operasi adalah penambahan, pergeseran atau rotasi kata, atau kombinasi bit bitwise; Bob harus dapat melakukannya dalam satu hari atau begitu).
Sekarang apa yang lemah tentang itu? SHA-256, menjadi fungsi hash kriptografis, tahan terhadap "preimage": ini berarti bahwa dengan memberikan hasil hash, sangat sulit untuk memulihkan input yang sesuai (itulah masalah yang dihadapi Hawa). Namun, "sangat keras" berarti "metode termudah adalah kekerasan: mencoba input yang mungkin sampai kecocokan ditemukan". Masalahnya adalah kekuatan kasar itu mudah di sini: tidak ada begitu banyak nomor telepon yang mungkin (di Amerika Utara, itu 10 digit, yaitu hanya 10 miliar). Bob ingin melakukan sesuatu dengan tangan, tetapi kita tidak bisa berasumsi bahwa Hawa sangat terbatas. PC dasar dapat mencoba beberapa juta hash SHA-256 per detik sehingga Hawa akan selesai dalam waktu kurang dari satu jam (kurang dari 5 menit jika dia menggunakan GPU).
Ini adalah masalah umum: jika Bob deterministik (yaitu untuk pesan yang diberikan dari Alice, ia akan selalu mengembalikan respons yang sama), Eve dapat mensimulasikannya. Yaitu, Eve tahu segalanya tentang Bob kecuali nomor teleponnya, jadi ia sebenarnya mengelola 10 miliar Bobs, yang hanya berbeda dengan nomor telepon yang mereka duga; dan dia menunggu salah satu Bobs virtual untuk mengembalikan apa pun yang sebenarnya dikembalikan oleh Bob yang sebenarnya. Cacat mempengaruhi banyak jenis solusi "pintar" yang melibatkan nonces acak dan enkripsi simetris dan yang lainnya. Ini adalah kelemahan yang kuat, dan akarnya terletak pada perbedaan besar dalam daya komputasi antara Eve dan Bob (sekarang, jika Bob juga memiliki komputer sebesar Eve, maka ia dapat menggunakan komputer yang lambat).fungsi hash melalui penggunaan banyak iterasi; itu kurang lebih tentang hashing kata sandi, dengan nomor telepon sebagai pengganti kata sandi; lihat bcrypt dan juga jawaban ini ).
Oleh karena itu, solusi yang tidak lemah harus melibatkan keacakan pada bagian Bob: Bob harus melempar koin atau melempar dadu berulang kali, dan menyuntikkan nilai-nilai dalam perhitungannya. Selain itu, Hawa tidak boleh bisa mengungkap apa yang dilakukan Bob, tetapi Alice harus mampu, sehingga beberapa informasi secara rahasia disampaikan dari Bob ke Alice. Ini disebut enkripsi asimetris atau, setidaknya, perjanjian kunci asimetris. Algoritma paling sederhana dari kelas itu untuk menghitung, tetapi masih cukup aman, kemudian RSA dengan padding PKCS # 1 v1.5 . RSA dapat menggunakan sebagai eksponen publik. Jadi protokolnya demikian:e=3
Alice menghasilkan bilangan bulat besar mana dan adalah bilangan bulat utama yang berukuran sama, sehingga ukuran cukup untuk memastikan keamanan (yaitu setidaknya 1024 bit, pada 2012). Juga, Alice harus mengatur agar dan tidak menjadi kelipatan dari 3.p q n p - 1 q - 1n=pq p q n p−1 q−1
Alice menulis di kartu.n
Bob pertama bantalan nomor teleponnya ke urutan byte selama , seperti yang dijelaskan oleh PKCS # 1 (berarti ini: 00 02 xx xx ... xx 00 bb bb .. bb, di mana 'bb' adalah byte sepuluh yang encode nomor telepon, dan 'xx' adalah nilai byte non-nol acak, untuk total panjang 128 byte jika adalah bilangan bulat 1024-bit).nn n
Bob menginterpretasikan urutan byte-nya sebagai nilai integer besar (pengkodean big-endian) dan menghitung (jadi itu adalah beberapa perkalian dengan bilangan bulat yang sangat besar, kemudian pembagian, hasilnya menjadi sisa divisi). Itu masih bisa dilakukan dengan tangan (tapi, di sana lagi, itu mungkin akan mengambil bagian yang lebih baik dari sehari). Hasilnya adalah apa yang Bob kirim kembali ke Alice.m 3 m o d nm m3 mod n
Alice menggunakan pengetahuannya tentang dan untuk memulihkan dari dikirim oleh Bob. Halaman Wikipedia di RSA memiliki beberapa penjelasan yang cukup jelas tentang proses itu. Setelah Alice memiliki , ia dapat menghapus padding ('xx' adalah non-nol, sehingga byte 'bb' pertama dapat ditemukan dengan jelas) dan ia kemudian memiliki nomor telepon, yang dapat ia bandingkan dengan yang ia miliki.q m m 3 m o d n mp q m m3 mod n m
Perhitungan Alice akan membutuhkan komputer (apa yang dilakukan komputer selalu dasar dan dapat dilakukan dengan tangan, tetapi komputer sangat cepat melakukannya, sehingga "bisa dilakukan" mungkin memerlukan waktu terlalu banyak untuk dilakukan dalam praktik; dekripsi RSA dengan tangan akan membutuhkan banyak minggu).
(Sebenarnya kita bisa memiliki perhitungan tangan yang lebih cepat dengan menggunakan enkripsi McEliece , tetapi kemudian kunci publik - apa yang ditulis Alice pada kartu - akan sangat besar, dan kartu tidak akan melakukannya; Eve harus membawa buku lengkap digit.)
sumber
Sepertinya aplikasi klasik Public Key Cryptosystem seperti RSA .
Anda mengirim kunci publik Anda bersama, BoB mengenkripsi nomor telepon Anda dari daftar kontaknya dan mengirimkannya kembali kepada Anda.
sumber
Salah satu hal paling mendasar yang dapat Anda lakukan adalah pertukaran kunci Diffie-Hellman . Itu tidak mengharuskan Anda untuk membuat kunci yang diatur sebelum komunikasi dimulai karena bernegosiasi dengan cara yang pendengar tidak bisa mendapatkan kunci sendiri. Lihat artikel Wikipedia yang komprehensif untuk detailnya.
Selama diimplementasikan dengan benar dan baik komunikator dan penyerang memiliki kekuatan perhitungan yang sama yang mereka miliki, ini aman.
sumber
Bob tidak perlu mengirim pesan apa pun yang dapat Anda dekripsi. Dia hanya harus membuktikan kepada Anda bahwa ia memiliki nomor telepon Anda. Oleh karena itu, Cryptographic Hash Functions , (enkripsi satu arah) menawarkan alternatif untuk cryptosystem kunci publik. SHA-2 saat ini adalah contoh populer dari fungsi tersebut.
Dalam strategi ini, Anda tidak perlu mendekripsi pesan Bob kembali kepada Anda. Anda memberi tahu Bob fungsi hash mana yang Anda ingin dia gunakan, misalnya "Bob, silakan gunakan SHA-2 untuk mengenkripsi nomor telepon saya dan minta Hawa menyerahkan hasilnya kembali kepada saya". Kemudian Anda menggunakan algoritma yang sama untuk mem-hash nomor telepon Anda, dan memeriksa apakah Anda mendapatkan hash yang sama dengan yang didapat Bob. Sangat tidak mungkin bahwa dua nomor telepon yang berbeda akan menghasilkan hash yang sama, sehingga Anda dapat menentukan apakah Bob memiliki nomor telepon yang benar atau tidak.
Jika Anda, Bob, dan Hawa tidak memiliki komputer yang tersedia untuk menghitung fungsi hash (atau melakukan serangan brute force), dimungkinkan untuk menggunakan fungsi hash yang mengorbankan beberapa keamanan terhadap serangan brute force tetapi jauh lebih mudah bagi Anda dan Bob menghitung.
sumber
Solusi sederhana adalah:
Baik Alice dan Bob setuju pada warna yang sama. dan tidak masalah jika Hawa tahu itu, kita akan menyebutnya P. Katakanlah itu berwarna kuning. Sekarang, Alice dan Bob keduanya secara acak memilih warna pribadi, katakan "x". Alice memilih merah, dan Bob memilih biru. Sekarang mereka mencampurnya dengan P. Alice sekarang berwarna oranye, dan Bob berwarna hijau. Alice mengirim warna oranye ke Bob, dan Bob mengirim warna hijau ke Alice Eve sekarang tahu tentang kuning, oranye, dan hijau tetapi Alice juga tahu warna pribadinya merah, dan Bob tahu warna pribadinya biru, yang tidak diketahui orang lain. Alice dan Bob mengambil warna pribadi asli mereka dan menambahkannya ke warna yang baru saja mereka tukar. Sekarang, jika mereka mencampur warna pribadi asli mereka, merah dan biru, menjadi warna bersama, mereka berdua berakhir dengan warna yang sama, semacam coklat, atau merah bata.
Alih-alih mencampurkan warna, Anda bisa menggunakan sedemikian rupa sehingga p adalah bilangan prima yang besar, dan g adalah akar primitif p karena jika Anda melakukan untuk setiap x, hasilnya (angka antara nol dan p - 1) sama - sama cenderung salah satu dari itu, itu sebabnya ada akar primitif. jika p adalah bilangan prima 2n + 1 sehingga n juga bilangan prima, maka Anda tahu bahwa 2 adalah akar primitif p (yang berarti Anda tidak perlu repot menghitung akar primitif, yang agak sulit) dengan demikian rahasia bersama = untuk Bob, dan untuk Alice.gx(modp) A xgx(modp) B yAx(modp) By(modp)
Saya pikir Anda dapat menulis sesuatu seperti ini di kartu:
Ada ( adalah jumlah digit) kemungkinan dan gagasan itu hanya akan membatalkan beberapa kemungkinan bagi orang yang telah mengetahui gagasan tentang itu. Jadi dekripsi oleh Hawa tidak akan terjadi. n(10)n n
sumber
Cukup minta Bob untuk mengalikan angka dengan 2 atau 3 atau apa pun dan ganti dengan nomor itu sendiri. Ini bisa dilakukan dengan tangan dan dapat dibalik jika jumlahnya diketahui. Tidak ada sha, rsa atau md5. Matematika sederhana.
sumber
Kirim Bob kata sandi dienkripsi dengan nomor telepon Anda; jika dia mengirimi Anda kata kode kembali, Anda tahu ia memiliki nomor yang benar.
Kelemahannya adalah Eve dapat mensimulasikan Bob, jadi coba saja setiap nomor telepon sampai dia mendapatkan nomor yang memberikan beberapa kata sandi saat Bob kembali.
Jadi suruh Bob menambahkan nomor acak yang sangat besar ke codeword kemudian mengenkripsi sebelum mengirimnya kembali kepada Anda. Ini membuat ruang pencarian Eves sebesar yang Anda inginkan.
sumber
Saya akan menulis sekitar 10 nomor telepon di kartu dan di antara mereka saya akan memastikan bahwa nomor saya akan datang di sebelah nomor Bob dan saya akan menyebutkan "Hei Bob, nomor saya di sebelah nomor Anda, harap verifikasi" :)
sumber
Saya pikir pertanyaannya jauh lebih sederhana daripada yang semua orang pikirkan. Kami diharuskan memverifikasi bahwa nomor yang Bob miliki benar (atau memang benar, salah). Karena kita "memeriksa" apakah nomornya benar, dapat diasumsikan bahwa Bob sudah memiliki nomor Anda. Karena itu, Bob tidak perlu mengirim nomor Anda ke beberapa kode. Jawaban saya adalah, "Bob terkasih, tolong telepon nomorku. Terima kasih, Alice"
sumber
coba lakukan trik bermain seperti ini
solution1: jika angkanya 37 maka peta hash akan terlihat seperti ini
01 07
15 12
25 20
31 36
49 43
53 50
60 62
72 72
85 82
91 94
dan lakukan hal yang sama untuk 10 digit atau lebih untuk membingungkan: P
solution2: atau membuat polinomial di mana nomor Anda menjadi beberapa nomor unik lainnya
solusi3: tulis ini dalam huruf "dude call me"
solution4: menulis fungsi sedemikian rupa sehingga ia beroperasi pada setiap digit dan mengembalikan 0 kemudian ia mengirim solusi benar atau salah5: jika kedua ujungnya berbagi fungsi hash yang sama ... itu membuat hidup sangat mudah
sumber
Saya pikir kita bisa melakukan ini dengan menggunakan operasi dasar yang sedikit bijaksana atau dapat menyesuaikannya untuk kertas dan pensil. Jika jumlah alice adalah sebagai contoh: 663 maka dia bisa mengonversi angka menggunakan metodologi ini. Konversikan setiap digit ke representasi biner yang setara, katakan ini sebagai A 663-> 110 110 011 daripada membalikkan bit yang sesuai untuk setiap nomor individu, katakan ini sebagai B-> 011 011 110 Sekarang lakukan A dan B-> 010 010 010 Sekarang kirim nomor ini ke bob dan meminta untuk melakukan hal yang sama jika hasilnya datang sama memintanya untuk mengatakan ya atau tidak. Dalam hal ini Eve tidak akan dapat memecahkan kode angka dan ada kemungkinan yang sangat rendah untuk memiliki nomor yang berbeda mengakhiri representasi yang sama ini. Satu-satunya cara malam bisa menebak adalah dengan menulis semua kombinasi yang mungkin dan kemudian mencoba semuanya kecuali untuk memenuhi itu kita bisa lebih mempersulit ini dengan menggunakan shift kiri atau kanan dan menambahkan bit dummy.
sumber
Silakan hubungi saya (nama saya 1001001). Jika Anda tidak dapat menghubungi saya, tuliskan nomor telepon yang Anda miliki dan minta Eve mengembalikan saya.
Penjelasan: jika Bob mendapatkan # saya yang benar, dia dapat menghubungi saya maka saya tahu itu # benar; jika Bob tidak mendapatkan hak # saya, Eve tidak dapat membaca nomor telepon saya (yang benar) juga. Dengan cara ini, saya sudah memeriksa bahwa teman saya, Bob, memiliki nomor telepon yang benar atau tidak.
sumber