Questa sfida ha una ricompensa di 200 punti per i primi a rispondere e rimanere imbattuti per almeno 3 giorni.Rivendicato dall'utente3080953 .
Ultimamente si parla molto della crittografia end-to-end e della pressione sulle aziende affinché la rimuovano dai loro prodotti. Non sono interessato ai diritti e ai torti di ciò, ma mi chiedevo: quanto può essere breve il codice che indurrebbe un'azienda a non essere utilizzata?
La sfida qui è implementare uno scambio di chiavi Diffie Hellman tra due sistemi in rete, quindi consentire agli utenti di comunicare avanti e indietro utilizzando la chiave simmetrica generata. Ai fini di questa attività, non sono necessarie altre protezioni (ad esempio, non è necessario scorrere la chiave, verificare le identità, proteggere da DoS, ecc.) E si può assumere una rete aperta (tutte le porte su cui si ascolta sono disponibili a tutti). L'uso dei builtin è consentito e incoraggiato!
Puoi scegliere uno dei due modelli:
- Un server e un client: il client si connette al server, quindi il server o il client può inviare messaggi all'altro. Le terze parti tra i due non devono poter leggere i messaggi. Un flusso di esempio potrebbe essere:
- L'utente A avvia il server
- L'utente B avvia il client e lo indirizza al server dell'utente A (ad es. Tramite IP / porta), il programma apre una connessione
- Il programma dell'utente A riconosce la connessione (facoltativamente chiedendo prima all'utente il consenso)
- Il programma dell'utente B inizia la generazione di un segreto DH e invia i dati richiesti (chiave pubblica, prime, generatore, qualsiasi altra esigenza di implementazione) all'utente A
- Il programma dell'utente A utilizza i dati inviati per completare la generazione del segreto condiviso e restituisce i dati richiesti (chiave pubblica) all'utente B. Da questo punto, l'utente A può inserire messaggi (ad es. Tramite stdin) che verranno crittografati e inviati all'utente B (ad es. Per stdout).
- Il programma dell'utente B completa la generazione del segreto condiviso. Da questo punto, l'utente B può inviare messaggi all'utente A.
- Oppure: un server con due client collegati ad esso: ogni client parla al server, che inoltra il proprio messaggio all'altro client. Il server stesso (e eventuali terze parti intermedie) non devono essere in grado di leggere i messaggi. Oltre alla connessione iniziale, il processo è lo stesso descritto nella prima opzione.
Regole dettagliate:
- È possibile fornire un singolo programma o più programmi (ad es. Server e client). Il tuo punteggio è la dimensione totale del codice in tutti i programmi.
- Il tuo programma deve essere teoricamente in grado di comunicare su una rete (ma per i test, localhost va bene). Se la tua lingua preferita non supporta la rete, puoi combinarla con qualcosa che lo fa (ad esempio uno script di shell); in questo caso il tuo punteggio è la dimensione totale del codice in tutte le lingue utilizzate.
- La generazione della chiave Diffie Hellman può utilizzare valori "p" e "g" codificati.
- La chiave condivisa generata deve essere almeno 1024 bit.
- Una volta che la chiave è condivisa, la scelta della crittografia a chiave simmetrica dipende da te, ma non devi scegliere un metodo che è attualmente noto per avere un attacco pratico contro di essa (ad esempio, uno spostamento di Cesare è banale da annullare senza conoscere la chiave ). Esempi di algoritmi consentiti:
- AES (qualsiasi dimensione chiave)
- RC4 (teoricamente rotto, ma nessun attacco pratico di cui posso trovare menzione, quindi è consentito qui)
- Gli utenti A e B devono entrambi essere in grado di inviare messaggi reciprocamente (comunicazione bidirezionale) in modo interattivo (ad es. Lettura di linee da stdin, richiesta continua o eventi come la pressione di un pulsante). Se è più semplice, puoi assumere una conversazione alternata (ad esempio, dopo che un utente ha inviato un messaggio, deve attendere una risposta prima di inviare il messaggio successivo)
- I built-in di lingua sono consentiti (non è necessario scrivere i propri metodi crittografici o di rete se sono già supportati).
- Il formato di comunicazione sottostante dipende da te.
- I passaggi di comunicazione indicati sopra sono un esempio, ma non è necessario seguirli (purché le informazioni necessarie siano condivise e nessun intermediario è in grado di calcolare la chiave o i messaggi condivisi)
- Se i dettagli necessari per connettersi al server non sono noti in anticipo (ad es. Se è in ascolto su una porta casuale), questi dettagli devono essere stampati. Si può presumere che l'indirizzo IP della macchina sia noto.
- La gestione degli errori (ad es. Indirizzi non validi, connessioni perse, ecc.) Non è richiesta.
- La sfida è il golf del codice, quindi vince il codice più breve in byte.
p
eg
permesso?