Si los clientes se comunican con el servidor cifrado, y asumimos que podemos confiar en el servidor, una manera fácil de hacerlo sería que el servidor transmita un fragmento de texto simple criptográficamente aleatorio a todos los clientes (por ejemplo, 2048 bits) .
Los clientes firman de forma criptográfica el texto sin formato con sus secretos compartidos y envían esas firmas al servidor, que almacena las respuestas en una tabla hash, donde cada respuesta también se asigna a una lista de clientes.
Cuando varios clientes dan la misma firma, el servidor informa a todos ellos, y cada cliente envía un paquete encriptado que contiene su ID junto con una marca de tiempo y no cifrado por la clave compartida. Estos paquetes se envían a cada cliente en la lista, junto con una identificación de cliente temporal generada por el servidor.
Cuando un cliente desea comunicarse con otro cliente, envía el ID temporal (servidor) de ese cliente al servidor. Cuando dos clientes se envían mutuamente el ID temporal al servidor, el servidor crea un túnel transparente entre ellos. Desde allí, los dos clientes pueden continuar comunicándose utilizando su canal compartido, enviando una marca de hora y una hora dentro de cada paquete cifrado.
Bastante seguro de que esto está a salvo de los ataques de repetición (debido a la marca de tiempo y la firma de datos aleatorios), pero asumo un algoritmo de cifrado fuerte, un buen algoritmo de firma de cifrado y una fuente de entropía criptográficamente sólida para los clientes y el servidor . Incluso si alguien malintencionado se conectara al servidor durante la fase de firma original y pudiera adivinar una firma de trabajo (o pudiera comprometer la calidad de la fuente de entropía del servidor, lo que crearía problemas adicionales, de todos modos, pero como están fingiendo) no podrían superar la etapa de selección de pares en la que los clientes eligen a qué otros clientes desean conectarse.
Crea una oportunidad DoS para el servidor, que realmente debería ser sin estado, pero las conexiones de red OTOH crean una oportunidad inherente para DoS; o bien permite que cualquiera se conecte a través de SSL y agote la memoria / ciclos / ancho de banda, o inicia la limitación de velocidad, y posiblemente excluya a los usuarios legítimos.
EDITAR: Respondí esta pregunta como una pregunta teórica, en lugar de dar un código o un algoritmo existente (AFAIK). De todos modos, como es un problema de juguete (suponiendo que el servidor no pueda ser pirateado va un poco lejos), pensé que estaría bien. Si eso no era lo que buscabas, te pido disculpas.