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?Jawaban:
Node.js (
372423 + 94 = 517513 bytes)Golf
Linebreak ditambahkan untuk "keterbacaan".
chat.js (
423419 bytes)Tidak ada jeda baris
Jeda baris
echo_server.js (94 bytes)
Tidak disatukan
Node memiliki kemampuan jaringan dan kripto bawaan. Ini menggunakan TCP untuk jaringan (karena lebih sederhana dari antarmuka Node untuk HTTP, dan ini berfungsi baik dengan stream).
Saya menggunakan stream cipher (RC4) bukan AES untuk menghindari harus berurusan dengan ukuran blok. Wikipedia tampaknya berpikir itu bisa rentan, jadi jika ada yang punya wawasan ke mana cipher disukai, itu akan bagus.
Jalankan server gema
node echo_server.js
yang akan mendengarkan pada port 9. Jalankan dua contoh dari program ini dengannode chat.js <server IP>
dannode chat.js <server IP> 1
(argumen terakhir hanya menetapkan yang mana yang mengirim prime). Setiap instance terhubung ke server gema. Pesan pertama menangani pembuatan kunci, dan pesan selanjutnya menggunakan stream cipher.Gema Server hanya mengirimkan semuanya kembali ke semua klien yang terhubung kecuali aslinya.
Klien
Server gema
Terima kasih Dave untuk semua tips + umpan balik!
sumber
Node.js,
638607 byteSekarang sudah baik dan benar-benar dipukuli (dan dalam bahasa yang sama), inilah jawaban tes saya:
Atau dengan pembungkus:
Pemakaian
Ini adalah implementasi server / klien; satu instantiation akan menjadi server, dan yang lainnya klien. Server diluncurkan dengan port tertentu, kemudian klien diarahkan ke port server. DH dapat membutuhkan waktu beberapa detik untuk pengaturan jika mesin Anda rendah pada entropi, sehingga pesan pertama mungkin sedikit tertunda.
Kerusakan
Satu-satunya persyaratan untuk token adalah bahwa mereka mengandung setidaknya satu karakter non-hex, sehingga dalam kode minified konstanta string lain yang digunakan (
data
danhex
).sumber