Un modo per farlo è con la condivisione segreta di Shamir . I tuoi dati di song sarebbero preceduti da un valore noto bene (es. "RIGHTKEY") quindi crittografati con un codice simmetrico come AES-CTR-128, e il segreto condiviso S sarebbe la chiave AES convertita in un numero intero a 128 bit.
Usando Shamir's genererai i tuoi 20 punti sulla curva, ognuno nella forma [x, f (x)] . Assegna ciascun punto a una domanda, aggiungendo il valore corretto della risposta (mappatura a, b, c, d a 1,2,3,4) alla parte f (x) , in modo tale da ottenere punti nella forma [x, f (x) + q] dove q è l'indice di risposta corretta 1, 2, 3 o 4. Se uno studente dovesse guardare il codice sorgente della pagina, vedrebbero solo un punto [x, y] e non saprebbero quale sia il valore di f (x) o q è.
Dopo l'invio del foglio delle risposte completato, si passa attraverso ciascuna risposta e si sottrae l'indice della risposta data dalla seconda parte del punto. Se la risposta è corretta, il loro valore sarà sottratto al valore originale di f (x) . Se abbastanza risposte sono corrette, avranno abbastanza punti [x, f (x)] per decifrare il segreto. Poiché alcune delle loro risposte potrebbero essere sbagliate, non puoi semplicemente utilizzare tutti i punti. Invece, si scorre su ogni possibile combinazione di risposte k e si tenta di calcolare il segreto condiviso, quindi utilizzare il segreto risultante per decrittografare i primi 8 byte della canzone crittografata e vedere se i dati sono "RIGHTKEY" . Se è così, sai di avere la chiave giusta. In caso contrario, si passa alla successiva iterazione e si riprova. Per un valore di k = 16 con 20 domande, devi solo eseguire al massimo 4845 tentativi; per un numero sufficiente di risposte corrette sarà molto più veloce in quanto è probabile che tu trovi una combinazione corretta nella fase iniziale del processo di decodifica.
Contro un approccio naive bruteforce, il sistema ha un limite di sicurezza di 4 k per una soglia di k risposte corrette. La principale debolezza è che se un utente è assolutamente sicuro di alcune risposte ma non ne conosce altre, può usare quelle che sa essere corrette per ridurre significativamente lo spazio a forza bruta. In definitiva, tuttavia, questo è un problema intrinseco per qualsiasi approccio di validazione lato client che utilizza le soglie. L'unico modo per evitare questo è di convalidare l'esame sul lato server rispetto a un insieme di risposte conosciute.