Solo quería mencionar que existe una especie de solución a este problema, pero es probable que no esté disponible para usted; la solución se denomina "cifrado homomórfico" y permite que un cliente realice un cálculo conocido sin saber exactamente con qué valores están computando, y que un servidor compruebe la estructura del valor computado para demostrar que el cliente no solo envíe una cadena aleatoria hacia atrás, pero en realidad la construyó a partir de los diversos valores proporcionados.
El problema es que es lento o incompleto , con "incompleto" lo que significa que "no incorpora una gama completa de primitivas lógicas". Muy a menudo es un sistema parcial que permite algunas operaciones de cifrado y descifrado E (), D (), además de una operación complicada, de modo que
D (E (A) ⊕ E (B)) = A + B,
o similar.
Así que veamos cómo esto resuelve el problema para algunos juegos. Considere un juego tipo "luces apagadas" en el que está presionando los hexes N de una cuadrícula hexagonal y cada uno alterna su estado y los estados de quienes lo rodean. Este es un álgebra conmutativa en esas "prensas" y, por lo tanto, no habrá más de N prensas totales en una solución dada, más cada hexágono solo depende del estado inicial más las prensas de su propio hexágono más los 6 hexágonos que lo rodean.
Dado que nuestro esquema de cifrado homomórfico solo permite +, no XOR, le damos a cada hexágono un contador de 3 bits por el número de veces que se ha volteado. (El software del cliente reducirá automáticamente cada doble pulsación de un hexágono a solo una pulsación). Por lo tanto, las acciones de giro reales son vectores de bits que parecen,
001 001 000 000 000 001 001 001 000 001 001 000 000 ... 000 00000000 00000001
En otras palabras, tienen 1s en cada uno de estos campos de 3 bits que voltea, más un 1 en algún contador de 16 bits.
Ciframos todo esto con un esquema de cifrado homomórfico, enviamos cada uno de ellos al cliente, y el cliente nos devuelve un valor cifrado calculado a partir de estos valores cifrados que devolvimos. Luego desciframos esto y el valor Y descifrado con la cadena de bits,
001 001 001 001 ... 001 11111111 00000000
y compárelo con el estado inicial del juego unido a 0 para esos 8 bits de contador.
Si nos envían un valor aleatorio, su probabilidad de que lo aceptemos es 2 - (N + 8) y, por lo tanto, su única forma útil de pasar las pruebas es usar los valores que les dimos. en alguna combinación permitida. Tienen acceso a algunos movimientos que no les estamos permitiendo directamente debido a desbordamientos de enteros, pero siempre podemos hacer que los campos tengan más de 3 bits para hacerlos más costosos para el contador de la derecha. Pero nunca nos transmitieron sus pulsaciones individuales, y mucho menos repetimos la historia: aceptamos un vector que decía "aquí está la forma en que volteé la cuadrícula", que es la "cosa súper insegura" de la que todos te están advirtiendo, pero Lo hizo de tal manera que no puedan hacer las cosas que nos preocupan sin tener acceso a una clave secreta.
En cambio, ves este tipo de cosas en la votación criptográfica, donde quieres tener la seguridad de que una máquina de votación no otorga espontáneamente 1000 votos a Alice.