DOMANDA Scambio chiave crittografica in una chat

MarkS3

Nuovo Utente
29
2
Ciao a tutti, come da titolo ho una domanda da porre.
Allora sto realizzando una piccola chat crittografata in java da portare come progetto per l'esame di maturità.
Si tratta di una chat UDP multicast con due classi. Una fondamentalmente che permette di inviare i messaggi e l'altra, un thread, che sta in attesa per ricevere messaggi dagli altri membri del gruppo.
Ora sorge il dubbio. Come faccio a crittografare il tutto?
Ho provato con l'RSA (uno degli algoritmi studiati quest'anno) ma ho problemi, perchè non riesco a capire come far prendere la chiave pubblica dalla parte che invia e quella privata dalla parte che riceve. E poi si prende la chiave pubblica del destinatario di solito, io ho un gruppo multicast, quindi non un unico destinatario.
Qualcuno conosce altri metodi più semplici per crittografare la stringa da inviare e decriptarla all'arrivo? Anche metodi semplici e banali.
Spero davvero che qualcuno possa aiutarmi, ci terrei a crittografare, anche molto più semplicemente di quanto io ho pensato, la chat.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
In un sistema di chiavi asimmetriche la chiave pubblica di ogni utente deve essere nota, tipicamente fornita da una PKI (public key infrastructure) che può essere nel tuo caso un server o qualcosa di simile. Il problema è che se mandi il messaggio a più utenti, per garantirne la segretezza dovrai criptare il messaggio per ogni altro utente usando la sua chiave pubblica, in questo modo i singoli destinatari leggeranno il messaggio decriptandolo con la propria chiave privata. Se vuoi anche garantire l'identità del mittente, puoi calcolare l'hash del messaggio, criptarlo con la chiave privata del mittente e metterlo dentro al messaggio (che viene poi criptato con la chiave pubblica del destinatario). Ma penso che questo ti sia già noto, è la classica procedura di firma asimetrica.
Alternativamente puoi usare una crittografazione simmetrica, usando quindi la stessa chiave per tutti i messaggi da e verso qualsiasi utente. La chiave simmetrica è privata e per condividerla puoi usare le chiavi asimmetriche sopra citate per creare un canale sicuro. Una volta che tutti hanno ricevuto la chiave simmetrica, usi quella per criptare e spedire in multicast.
Altra alternativa, che non richiede una PKI, è l'utilizzo di Diffie-Helmann per creare un canale sicuro e scambiare la chiave simmetrica che poi utilizzi per continuare lo scambio messaggi. Ti conviene in questo caso scegliere un utente "master" (per esempio quello che avvia la chat di gruppo) che si preoccupa di scegliere e diffodere la chiave simmetrica a ogni utente che si aggiunge alla chat.
Queste sono solo alcune idee... sicuramente c'è di meglio.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Allora sto realizzando una piccola chat crittografata in java da portare come progetto per l'esame di maturità.
Mi sembra un po' pretenzioso per le tue competenze, obbiettivamente. E' un'impresa lunga ed astrusa, nonché richiedente di conoscenze piuttosto estensive sulla questione. Ti consiglio due vie alternative:
  • Usa un semplice algoritmo di mascheramento delle informazioni come il classico cifrario di cesare et similia. (osserva infatti non parliamo di crittografia dei dati) Puoi anche inventarne uno tuo, che credo darà una migliore impressione perché dà a vedere che effettivamente hai interesse nel spendere il tuo tempo in ciò.
  • Usa protocolli a più alto livello che si occupano del layer crittografico sottostante. Troverei interessante, ad esempio, WebSocket, di cui trovi una realizzazione crittografata (via HTTPS) e non qui.

Personalmente, far vedere "che sai mettere insieme RSA ed AES" mi significa ben poco, anzi che hai una conoscenza piuttosto bassa a riguardo; ci sono innumerevoli problematiche collaterali a ciò e nessuno vorrebbe metterci mano: per questo esiste TLS.

Poi non capisco perché usare UDP. E' totalmente insensata come scelta, perché sono necessari i servizi del TCP: non ha senso rendere i sicuri i messaggi se poi non hai un handshake a 3 o 4 vie e quindi sei soggetto a spoofing. Lasciando stare del tutto il fatto che i messaggi non hanno garanzia di essere trasmessi.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!