Volevo solo menzionare che esiste una sorta di soluzione a questo problema, ma è probabile che non sia disponibile per te; la soluzione è chiamata "crittografia omomorfica" e consente a un client di eseguire un calcolo noto senza sapere esattamente quali valori stanno calcolando, e un server per verificare quindi la struttura del valore calcolato per dimostrare che il client non solo invia una stringa casuale indietro ma in realtà lo ha costruito tra i diversi valori forniti.
Il problema è che è lento o incompleto , con "incomplete" che significa "non include un'intera gamma di primitive logiche". Molto spesso si tratta di un sistema parziale che consente alcune operazioni di crittografia e decrittografia E (), D (), più alcune operazioni complicate ⊕ tali che
D(E(A) ⊕ E(B)) = A + B,
o simili.
Quindi vediamo come questo risolve il problema per alcuni giochi. Si consideri un gioco di tipo "luci spente" in cui si preme sugli esagoni N di una griglia esagonale e ognuno alterna sia il suo stato che gli stati di quelli intorno ad esso. Questa è un'algebra commutativa su quelle "presse" e quindi non ci sarà più di N presse totali in una data soluzione, più ogni esagono dipende solo dallo stato iniziale più le presse del proprio esagono più i 6 esagoni attorno ad esso.
Poiché il nostro schema di crittografia omomorfico consente solo +, non XOR, diamo a ciascun esagono un contatore a 3 bit per il numero di volte in cui è stato capovolto. (Il software client si ridurrà automaticamente ogni doppia pressione di un esagono ad una sola pressione.) Le azioni di inversione effettive sono quindi come i vettori di bit,
001 001 000 000 000 001 001 001 000 001 001 000 000 ... 000 00000000 00000001
In altre parole hanno 1s in ciascuno di questi campi a 3 bit che si capovolge, più un 1 in un contatore a 16 bit.
Cifriamo tutti questi elementi con uno schema di crittografia omomorfico, inviamo ognuno di essi al client e il client ci restituisce un valore crittografato calcolato da questi valori crittografati che abbiamo inviato indietro. Quindi decifriamo questo e AND il valore decrittografato con il bitstring,
001 001 001 001 ... 001 11111111 00000000
e confronta con lo stato di gioco iniziale contiguo a 0 per questi 8 bit di contatore.
Se ci inviano un valore casuale, la loro possibilità di accettarlo è 2 - (N + 8) e quindi il loro unico modo utile per superare i test è usare i valori che abbiamo dato loro in alcune combinazioni consentite. Hanno accesso ad alcune mosse che non le stiamo permettendo direttamente a causa di overflow interi, ma possiamo sempre rendere i campi più larghi di 3 bit per renderli più costosi per il contatore a destra. Ma non abbiamo mai trasmesso le loro singole pressioni dei tasti, tanto meno ripetiamo la cronologia: abbiamo accettato un vettore che diceva "ecco come ho capovolto la griglia", che è la "cosa super insicura" di cui tutti ti stanno mettendo in guardia, ma noi ha fatto in modo che non possano fare le cose di cui siamo preoccupati senza accesso a una chiave segreta.
Invece si vede questo genere di cose nel voto crittografico dove si vuole avere la certezza che una macchina per il voto non dà spontaneamente 1000 voti ad Alice.