Să presupunem că un server joacă un joc de blackjack cu un client, iar cărțile sunt amestecate și împărțite de către server. Amestecarea în sine poate fi sau nu corectă, dar ceea ce trebuie arătat este că cărțile împărțite nu au fost modificate în timpul jocului, adică: după începerea mâinii, cărțile din pachet nu au în secret ordinea schimbată de server.
Mă gândeam la următoarea soluție folosind criptografie și am vrut să obțin feedback dacă ar fi acceptabilă pentru un sistem de producție și, dacă nu, de ce nu:
Pasul 1) Serverul ar amesteca în secret un pachet de cărți într-o anumită ordine, spuneți următoarele (omitem costumul pentru simplitate): [3, 9, 2, ..., A]
Ar crea apoi următorul mesaj M:
M = "Amestecare carduri: [3, 9, 2, ..., A]. Număr aleatoriu: A96A...QT3"
Numărul aleatoriu este un număr aleatoriu pe care serverul îl generează intern și îl păstrează secret până la încheierea jocului. Lungimea sa ar fi suficient de mare pentru a preveni spargerea hash-ului de către client prin forța brută (să spunem că are 512 caractere lungime).
Acum serverul va hash M folosind sha-256 sau alt algoritm de hashing de încredere, de exemplu: hash(M)
Pasul 2) Înainte de începerea jocului, serverul trimite acest hash (M) către client, pe care clientul îl stochează. Clientul nu are de unde să-l cunoască pe M din ceea ce pot aduna.
Pasul 3) Jocul începe, cărțile sunt împărțite în ordinea amestecate, jucătorul ia decizii și jocul se încheie în sfârșit.
Pasul 4) Clientul vrea acum să știe că jocul a fost corect, adică: serverul nu a trișat modificând cărțile în timpul mâinii. Serverul trimite acum mesajul „M” clientului în text simplu pentru a arăta acest lucru.
Pasul 5) Clientul rulează hash(M) și vede că se potrivește hash(M) primit la pasul 1.
Este aceasta o modalitate corectă de a demonstra că jocul a fost corect, fără ca clientul sau serverul să poată trișa, excluzând posibilitatea ca amestecul în sine să nu fi fost aleatoriu? Dacă serverul ar modifica cărțile din amestecul inițial în timpul mâinii, atunci clientul ar vedea acest lucru în Pasul 5 (fie ordinea ar fi diferită transparent de client, fie hash-ul mesajului trimis în Pasul 4). ar fi diferit de cel trimis la pasul 2). De asemenea, un singur hash este trimis pe mână, astfel încât serverul nu poate genera un număr mare de hash-uri și le poate trimite separat, apoi îl alege pe cel mai bun pe parcursul mâinii.