Sto progettando un server che accetta messaggi anonimi usando ECIES: come in, gli utenti anonimi inviano al server una chiave pubblica EC effimera, e il server usa ECDH per ricavare un segreto condiviso, e alcuni KDF per ottenere una chiave simmetrica condivisa per decifrare il messaggio reale. Il problema è ECDH, che è uno degli scambi di chiavi più veloci disponibili, è molto lento. Da alcuni test rapidi, il mio computer può gestire solo circa 3000 scambi di chiavi al secondo.
Un utente malintenzionato potrebbe costantemente calcolare gli scambi di chiavi e inviarli al server. Non sono troppo preoccupato per questo se l'attaccante ha effettivamente effettuato gli scambi di chiavi. Almeno in questo modo, l'attaccante farà tutto il lavoro (un po 'di più con ECDH) come server. Il problema è che un utente malintenzionato può inviare una chiave di immondizia e fare in modo che il server esegua molto lavoro eseguendo lo scambio di chiavi su garbage. La mia prima domanda è, in un'implementazione ragionevole come OpenSSL, che lo scambio di chiavi ritorni rapidamente con un errore, o impieghi molto tempo a fare calcoli inutili?
Supponendo che quanto sopra sia corretto, ci sono altri due problemi: un utente malintenzionato potrebbe usare la stessa chiave effimera più e più volte, mantenendo il segreto condiviso ma facendo ripetutamente il cambio di chiave del server; e un utente malintenzionato potrebbe precedere preventivamente molte chiavi effimere e inviarle tutte in una volta.
Un tentativo di soluzione a entrambi i problemi è che il server mantenga la propria coppia di chiavi effimera che cambia ogni ~ 10 minuti. Può pubblicare la sua chiave pubblica effimera firmata con la sua chiave privata permanente. Quindi non sarebbe irragionevole per il server ricordare le chiavi e i segreti corrispondenti ricevuti durante questo periodo. Tuttavia, questo non risolve realmente l'attacco precomputazione perché le chiavi EC generate correttamente funzioneranno ancora con uno scambio di chiavi, ma produrranno solo dati inutili. C'è un modo veloce per un server di sapere che una determinata chiave decodificherà il messaggio?
Ci scusiamo per il post lungo e grazie in anticipo a qualsiasi commento.