Tantangan ini membawa hadiah 200 poin bagi yang pertama menjawab dan tetap tak terkalahkan selama setidaknya 3 hari.Diklaim oleh pengguna3080953 .
Ada banyak pembicaraan akhir-akhir ini tentang enkripsi ujung ke ujung, dan tekanan pada perusahaan untuk menghapusnya dari produk mereka. Saya tidak tertarik pada hak-dan-kesalahan itu, tapi saya bertanya-tanya: seberapa pendek kode yang bisa membuat perusahaan ditekan untuk tidak menggunakannya?
Tantangannya di sini adalah untuk mengimplementasikan pertukaran kunci Diffie Hellman antara dua sistem jaringan, kemudian memungkinkan pengguna untuk berkomunikasi bolak-balik menggunakan kunci simetris yang dihasilkan. Untuk tujuan tugas ini, tidak ada perlindungan lain yang diperlukan (mis. Tidak perlu memutar kunci, memverifikasi identitas, melindungi terhadap DoS, dll.) Dan Anda dapat menggunakan internet terbuka (semua port yang Anda dengarkan tersedia untuk semua orang). Penggunaan bawaan diizinkan dan dianjurkan!
Anda dapat memilih salah satu dari dua model:
- Server dan klien: klien terhubung ke server, kemudian server atau klien dapat mengirim pesan ke yang lain. Pihak ketiga di antara keduanya harus tidak dapat membaca pesan. Contoh aliran dapat berupa:
- Pengguna A meluncurkan server
- Pengguna B meluncurkan klien dan mengarahkannya ke server pengguna A (mis. Melalui IP / port), program membuka koneksi
- Program Pengguna A mengakui koneksi (opsional meminta persetujuan terlebih dahulu kepada pengguna)
- Program Pengguna B memulai pembuatan rahasia DH, dan mengirimkan data yang diperlukan (kunci publik, prima, generator, apa pun yang dibutuhkan implementasi Anda) kepada Pengguna A
- Program Pengguna A menggunakan data yang dikirim untuk menyelesaikan pembuatan rahasia bersama dan mengirimkan kembali data yang diperlukan (kunci publik) kepada Pengguna B. Dari titik ini, Pengguna A dapat memasukkan pesan (misalnya melalui stdin) yang akan dienkripsi dan dikirim ke Pengguna B (misalnya ke stdout).
- Program Pengguna B menyelesaikan pembuatan rahasia bersama. Dari titik ini, Pengguna B dapat mengirim pesan ke Pengguna A.
- Atau: Server dengan dua klien yang terhubung: setiap klien berbicara ke server, yang meneruskan pesan mereka ke klien lain. Server itu sendiri (dan pihak ketiga mana pun di antaranya) harus tidak dapat membaca pesan. Selain koneksi awal, prosesnya sama seperti yang dijelaskan dalam opsi pertama.
Aturan terperinci:
- Anda dapat menyediakan satu program, atau beberapa program (mis. Server & klien). Skor Anda adalah ukuran kode total di semua program.
- Program Anda secara teoritis harus mampu berkomunikasi melalui jaringan (tetapi untuk pengujian, localhost baik-baik saja). Jika bahasa pilihan Anda tidak mendukung jaringan, Anda dapat menggabungkannya dengan sesuatu yang mendukung (misalnya skrip shell); dalam hal ini skor Anda adalah ukuran kode total di semua bahasa yang digunakan.
- Generasi kunci Diffie Hellman dapat menggunakan nilai-nilai "p" dan "g" yang dikodekan dengan keras.
- Kunci bersama yang dihasilkan harus setidaknya 1024 bit.
- Setelah kunci dibagikan, pilihan enkripsi kunci-simetris terserah Anda, tetapi Anda tidak boleh memilih metode yang saat ini diketahui memiliki serangan praktis terhadapnya (misal, pergeseran caesar sepele untuk dibalik tanpa mengetahui kunci tersebut. ). Contoh algoritma yang diizinkan:
- AES (ukuran kunci apa saja)
- RC4 (secara teori rusak, tetapi tidak ada serangan praktis yang dapat saya sebutkan, jadi diizinkan di sini)
- Pengguna A dan B harus dapat mengirim pesan satu sama lain (komunikasi dua arah) secara interaktif (misalnya membaca baris dari stdin, terus menerus mendorong, atau acara seperti menekan tombol). Jika itu membuatnya lebih mudah, Anda dapat mengasumsikan percakapan bergantian (yaitu setelah pengguna mengirim pesan, mereka harus menunggu jawaban sebelum mengirim pesan berikutnya)
- Builtin bahasa yang diizinkan (tidak perlu menulis metode kriptografi atau jaringan Anda sendiri jika mereka sudah didukung).
- Format komunikasi yang mendasarinya terserah Anda.
- Langkah-langkah komunikasi yang diberikan di atas adalah contoh, tetapi Anda tidak diharuskan untuk mengikutinya (selama informasi yang diperlukan dibagikan, dan tidak ada perantara yang dapat menghitung kunci atau pesan yang dibagikan)
- Jika detail yang diperlukan untuk terhubung ke server Anda tidak diketahui sebelumnya (mis. Jika mendengarkan pada port acak), detail ini harus dicetak. Anda dapat mengasumsikan bahwa alamat IP mesin diketahui.
- Penanganan kesalahan (mis. Alamat tidak valid, kehilangan koneksi, dll.) Tidak diperlukan.
- Tantangannya adalah kode golf, jadi kode terpendek dalam byte menang.
p
dang
diperbolehkan?