Chciałem tylko wspomnieć, że istnieje rozwiązanie tego problemu, ale prawdopodobnie nie będzie ono dostępne dla Ciebie; to rozwiązanie nazywa się „szyfrowaniem homomorficznym” i pozwala klientowi wykonać znane obliczenia bez dokładnej wiedzy, z jakimi wartościami oblicza, a serwerowi w związku z tym sprawdzić strukturę obliczonej wartości, aby udowodnić, że klient nie tylko wysyła losowy ciąg z powrotem, ale w rzeczywistości zbudował go z kilku podanych wartości.
Problem w tym, że jest albo powolny albo niekompletny , z „niepełnym” znaczeniem „nie zawiera pełnego zakresu logicznych prymitywów”. Bardzo często jest to częściowy system pozwalający na pewne operacje szyfrowania i deszyfrowania E (), D (), a także pewne skomplikowane operacje ⊕ takie, że
D (E (A) ⊕ E (B)) = A + B,
lub tym podobne.
Zobaczmy, jak to rozwiązuje problem w niektórych grach. Rozważ grę typu „gas out”, w której naciskasz N heksów sześciokątnej siatki i każdy z nich przełącza zarówno swój stan, jak i stany osób wokół niego. Jest to algebra przemienna na tych „tłoczeniach”, a zatem w danym rozwiązaniu nie będzie więcej niż N naciśnięć łącznie, a każdy heks zależy tylko od stanu początkowego plus naciśnięcia jego własnego heksa plus 6 heksów wokół niego.
Ponieważ nasz schemat szyfrowania homomorficznego dopuszcza tylko +, a nie XOR, dajemy każdemu szesnastkowemu 3-bitowy licznik określający, ile razy został odwrócony. (Oprogramowanie klienta automatycznie zmniejszy każde dwukrotne naciśnięcie klawisza szesnastkowego do zaledwie jednego naciśnięcia.) Rzeczywiste działania odwracania mają zatem wygląd wektorów bitowych,
001 001 000 000 000 001 001 001 000 001 001 000 000 ... 000 00000000 00000001
Innymi słowy, mają jedynki w każdym z tych 3-bitowych pól, które zmienia, plus 1 w 16-bitowym liczniku.
Szyfrujemy to wszystko za pomocą homomorficznego schematu szyfrowania, wysyłamy każdy z nich do klienta, a klient odsyła nam zaszyfrowaną wartość obliczoną na podstawie tych zaszyfrowanych wartości, które odesłaliśmy. Następnie odszyfrowujemy to i odszyfrowaną wartość za pomocą łańcucha bitów,
001 001 001 001 ... 001 11111111 00000000
i porównać z początkową grą -stan połączony z 0 dla tych 8 bitów licznika.
Jeśli wysyłają nam losową wartość, ich szansa, że ją zaakceptujemy, wynosi 2 - (N + 8) , a zatem ich Jedynym użytecznym sposobem zaliczenia testów jest użycie wartości, które im podaliśmy w dozwolonej kombinacji. Mają dostęp do niektórych ruchów, na które nie pozwalamy im bezpośrednio z powodu przepełnienia liczb całkowitych, ale zawsze możemy zrobić pola szersze niż 3 bity, aby uczynić je bardziej kosztownymi dla licznika po prawej stronie. Ale nigdy nie przesyłano nam ich indywidualnych naciśnięć przycisków, a tym bardziej nie odtwarzaliśmy historii: zaakceptowaliśmy wektor mówiący „oto jak odwróciłem siatkę”, co jest „bardzo niepewną rzeczą”, przed którą wszyscy cię ostrzegają, ale my zrobili to w taki sposób, że nie mogą robić rzeczy, o które się martwimy, bez dostępu do tajnego klucza.
Zamiast tego w głosowaniu kryptograficznym widzisz tego rodzaju rzeczy, w których chcesz mieć pewność, że maszyna do głosowania nie daje Alice spontanicznie 1000 głosów.