Nota: questa risposta può essere basata su un malinteso della domanda - vedere i commenti di seguito.
Breve risposta generica: utilizzare le firme digitali .
In particolare, il server principale dovrebbe disporre di una chiave privata per un adeguato schema di firma digitale (RSA, DSA, ECDSA, ecc.) E dovrebbe in qualche modo inoltrare in modo sicuro la sua chiave pubblica a tutti i client. Quindi il server può firmare tutti i dati che invia ai client con la chiave privata (o eventualmente usarlo per negoziare un segreto condiviso utilizzabile per crittografare e / o autenticare simmetricamente le comunicazioni tra esso e quel particolare client) e il client può utilizzare la chiave pubblica per verificare che la firma sia stata generata dal server.
Naturalmente, il prossimo problema è distribuendo la chiave pubblica in modo che un server canaglia non può parodia che e sostituire la propria chiave pubblica. Potrebbe non essere così difficile se riesci a farlo in anticipo (ad esempio distribuendo la chiave insieme all'eseguibile del gioco), ma diventa difficile se devi farlo in un secondo momento, ad esempio perché l'identità del server principale non è nota in avanzare. Una soluzione standard è quella di distribuire qualche altra chiave pubblica (la cui chiave privata corrispondente è nota solo a te) in anticipo a tutti i client, quindi firmare il messaggio contenente la chiave pubblica del server master con quell'altra chiave prima di trasmetterla.
In effetti, potresti persino estendere ulteriormente tali catene di firme, ad esempio avere una chiave privata principale super segreta, che è tenuta chiusa in un luogo sicuro e la cui chiave pubblica è nota a tutti i client e un'altra chiave privata di "uso quotidiano" che viene effettivamente utilizzato per firmare le chiavi del server e la cui chiave pubblica è essa stessa firmata con la chiave master super segreta prima che sia bloccata nella cassaforte. Questo non è così utile da solo, ma diventa potenzialmente molto utile se includi anche un meccanismo per revocare le chiavi compromesse, in modo che, ad esempio, se la tua chiave di uso quotidiano sia trapelata, puoi semplicemente revocarla e generarne un'altra.
Quello che descrivo sopra è un tipo rudimentale di infrastruttura a chiave pubblica . In realtà implementarne uno in modo sicuro può diventare piuttosto complicato, ma fortunatamente è stato fatto prima. In effetti, ogni volta che ti connetti a un sito Web (come Wikipedia ) tramite HTTPS , questo è praticamente esattamente ciò che fa il tuo browser: riceve un certificato di chiave pubblica dal server, verifica che il certificato corrisponda al nome del server nell'URL, non è elencato come revocato ed è stato firmato da un'autorità di certificazione nota e attendibile , quindi lo utilizza per negoziare una chiave di crittografia simmetrica temporaneanoto solo a se stesso e al proprietario della chiave privata corrispondente al certificato. Questa chiave simmetrica viene quindi utilizzata per crittografare e autenticare tutti i dati inviati tra il client e il server.
In particolare, dovresti davvero dare un'occhiata alle librerie SSL / TLS esistenti (che in genere vengono con un'implementazione PKI X.509 ), o eventualmente a SPKI . Questi sono ancora un po 'complicati, ma probabilmente più facili (e più sicuri) che provare a creare il tuo.