Volevo solo menzionare che esiste una sorta di soluzione a questo problema, ma probabilmente non sarà disponibile per te; la soluzione si chiama "crittografia omomorfica" e consente a un client di eseguire un calcolo noto senza sapere esattamente con quali valori sta calcolando, e un server per controllare quindi la struttura del valore calcolato per dimostrare che il client non ha semplicemente invia una stringa casuale indietro ma in realtà la costruisce a partire dai diversi valori forniti.
Il problema è che è lento o incompleto , con il significato di "incompleto" "non incorpora una gamma completa di primitive logiche". Molto spesso è un sistema parziale che consente alcune operazioni di crittografia e decrittazione 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. Considera un gioco di tipo "luci spente" in cui premi sugli N esagoni di una griglia esagonale e ognuno alterna il proprio stato e gli stati di coloro che lo circondano. Questa è un'algebra commutativa su quelle "pressioni" e quindi non ci saranno più di N pressioni totali in una data soluzione, inoltre ogni esagono dipende solo dallo stato iniziale più le pressioni del proprio esagono più i 6 esagoni attorno ad esso.
Poiché il nostro schema di crittografia omomorfico consente solo +, non XOR, diamo a ciascun esadecimale un contatore a 3 bit per il numero di volte in cui è stato capovolto. (Il software client ridurrà automaticamente ogni doppia pressione di un esadecimale a una sola pressione.) Le azioni di capovolgimento effettive sono quindi vettori di bit che assomigliano a,
001 001 000 000 000 001001 001 000 001 001 000 000 ... 000 00000000 00000001
In altre parole hanno 1 in ciascuno di questi campi a 3 bit che capovolge, più un 1 in un contatore a 16 bit.
Li crittografiamo tutti con uno schema di crittografia omomorfico, li inviamo 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 la stringa di bit,
001 001 001 001 ... 001 11111111 00000000
e confrontiamo con il gioco iniziale -stato adiacente a 0 per quegli 8 bit contatore.
Se ci inviano un valore casuale, la loro possibilità che lo accettiamo è 2 - (N + 8) e quindi la loro L'unico modo utile per superare i test è usare i valori che abbiamo fornito loro in alcune combinazioni consentite. Hanno accesso ad alcune mosse che non stiamo consentendo loro direttamente a causa di overflow di interi, ma possiamo sempre rendere i campi più larghi di 3 bit per renderli più costosi per il contatore a destra. Ma non ci sono mai state trasmesse le singole pressioni dei pulsanti, tanto meno la cronologia: abbiamo accettato un vettore che dice "ecco come ho capovolto la griglia", che è la "cosa super insicura" di cui tutti ti mettono in guardia, ma noi lo hanno fatto in modo tale che non possano fare le cose di cui ci preoccupiamo senza avere accesso a una chiave segreta.
Invece si vedono queste cose nelle votazioni crittografiche in cui si desidera avere la certezza che una macchina per il voto non dà spontaneamente 1000 voti ad Alice.