Puncte:15

Pachetul de cărți care se dovedește corect folosit de client și server

drapel cn

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.

marstato avatar
drapel sa
Ce faci dacă clientul află că hash-ul inițial și Hash-ul Client-Computer nu sunt egale?
drapel in
@marstato: Atunci știi că serverul te-a înșelat și (sperăm că) poți depune o rambursare sau ceva de genul. Dar dacă ai folosit Bitcoin pentru a plăti, s-ar putea să nu ai noroc.
marstato avatar
drapel sa
@Kevin, vrei să spui o acuzare înapoi cu cei care conduc serverul fraudulos?
user4779 avatar
drapel cn
@marstato Pur și simplu aș opri jocul. Serverul capătă o reputație proastă și îi este greu să atragă clienți noi.
drapel in
@marstato: Nu, cu compania dvs. de card de credit, la fel cum ați face cu orice altă tranzacție frauduloasă. N-am auzit niciodată să depun o rambursare la vânzător. Din câte știu eu, pur și simplu nu este un lucru.
Hagen von Eitzen avatar
drapel rw
Dacă dimensiunea hash este prea mică, serverul ar putea începe cu două amestecări care diferă doar în ultimele două cărți și să caute o coliziune între hash-uri ale acestora atunci când variază biții suplimentari aleatori (paradoxul zilei de naștere).Cu două astfel de pachete pregătite, serverul ar putea trișa cu un pariu all-or-nothing în ordinea ultimelor două cărți... Prin urmare, clientul ar trebui să depună o contribuție aleatorie, astfel încât pachetul să fie cel puțin garantat să nu fie diligent. pregătit
user4779 avatar
drapel cn
@Hagen von Eitzen Nu? Credeam că sha-256 nu are coliziuni cunoscute. De asemenea, ceea ce spui ar încălca efectul de avalanșă
Toby Speight avatar
drapel in
Câte cărți sunt în pachet? Doar un pachet de 52 de cărți sau substanțial mai multe?
Puncte:22
drapel es

Ați creat un angajament hash cu un factor de orbire aleatoriu. Acest lucru va funcționa, iar factorul orbitor este necesar, astfel încât, pe măsură ce cărțile sunt dezvăluite progresiv jucătorului, să nu fie posibil ca jucătorul să învețe informații utile despre mesajul hash pentru a putea forța brut restul pachetului amestecat. . Un factor de orbire de 128 de biți uniform aleatoriu este suficient.

Puteți compacta mai mult acest lucru declarând un „seed” de 128 de biți în loc să enumerați toate pozițiile individuale ale cardurilor și apoi folosind un amestecare deterministă pe baza acestei sămânțe pentru a amesteca cărțile.

Dacă faceți acest lucru folosind metoda de amestecare de mai sus, nu va trebui să utilizați un factor orbitor. Aceasta deoarece, prin definiție, a CSPRNG poate rezista la „testul următorului bit”. Cunoașterea unora dintre rezultatele unui CSPRNG nu va ușura forța brută a semințelor și nu va oferi niciun avantaj în ghicirea următoarelor cărți din pachet.

Prin urmare, $commitment = hash(\texttt{seed de 128 de biți})$.

Rețineți că o amestecare cu adevărat aleatorie va avea $log_2(52!)\approxeq225$ biți de entropie, care este mai mare decât entropia seminței. Cu toate acestea, ar fi imposibil să se determine chiar și un singur rezultat amestecat care nu ar putea fi obținut (din aprox. $2^{225}$ posibile amestecări), și deci nu ar fi o îmbunătățire să aveți o sămânță mai mare de 128 de biți.

Jacob Raihle avatar
drapel us
O amestecare deterministă bazată pe o semințe de 128 de biți nu ar face imposibilă atingerea marii majorități a amestecurilor posibile (~225 de biți)? Majoritatea posibilelor amestecări nu vor fi lovite oricum, având în vedere câte sunt, dar acesta pare genul de lucru care ar deranja pe cineva care este îngrijorat de corectitudinea amestecării.
knaccc avatar
drapel es
@JacobRaihle Cu o sămânță de 128 de biți, ar fi imposibil să se determine chiar și un singur rezultat de amestecare care nu ar putea fi obținut (din cele aproximativ 2$^{225}$ posibile). Prin urmare, i-ar deranja pe oameni în același mod în care îi deranjează pe oameni că există șansa ca cineva să poată forța brut aceeași sămânță de 128 de biți.
drapel ma
Cred că factorul orbitor este o idee bună. Dacă pachetul brut a fost comis prin hash, atunci dacă la un moment dat majoritatea cărților sunt dezvăluite jucătorului, acesta poate forța brute cărțile rămase.
knaccc avatar
drapel es
@Nayuki este un punct excelent. Am modificat răspunsul pentru a indica faptul că sămânța este necesară pentru schema propusă în întrebare. Cu toate acestea, nu ar fi necesar atunci când se utilizează o semințe de amestecare deterministă, deoarece aceasta ar echivala cu posibilitatea de a determina o anumită cunoaștere a semințelor CSPRNG pe baza rezultatului CSPRNG.
Jack Aidley avatar
drapel cn
Presupunând că marea, copleșitoarea majoritate a amestecurilor posibile nu contează, sună ca genul de greșeală care ar costa un cazinou online o tonă de bani. Chiar și cel mai mic dintre semnale poate schimba balanța probabilităților.
knaccc avatar
drapel es
@JackAidley, folosești aceeași logică care îi face pe oameni să se îngrijoreze că cheia lor de portofel bitcoin aleasă aleatoriu ar putea fi forțată. Nu există un semnal mic de preluat, din același motiv matematic că cunoașterea angajamentului hash nu constituie un mic semnal despre sămânță. Este adevărat din punct de vedere tehnic că ai putea reuși cu forța brută, dar trebuie să ai încredere cât de puțin probabil din punct de vedere astronomic este.
Jack Aidley avatar
drapel cn
@knacc Nu trebuie să forțați nimic, trebuie doar ca probabilitatea ca cardul X să urmeze cardul Y să nu fie exact 1/52. În timp ce 128 de biți va face lucrurile mult mai greu de detectat, cu bani pe linie orice defect va fi exploatat. Acest lucru s-a întâmplat de fapt cu cazinourile online care nu au reușit să folosească algoritmi corespunzători de amestecare în trecut, deși, desigur, nu la nivelul de 128 de biți.
knaccc avatar
drapel es
@JackAidley cu cunoștințe despre angajamentul hash, este, de asemenea, adevărat din punct de vedere tehnic că, după ce au fost împărțite câteva cărți (pentru a ține cont de problemele de coliziune hash), puteți spune cu 100% certitudine care vor fi toate cărțile rămase în amestecare.Cu toate acestea, odată ce începeți să cuantificați de fapt natura astronomică a forței brute implicate, imaginea arată cu totul diferită.
Puncte:21
drapel ar

Pentru a extinde răspunsul lui knaccc, este chiar posibil să folosiți scheme de angajament pentru a demonstra (până la un punct) că serverul nu a trișat în timpul amestecării, de ex. ca aceasta:

  1. Serverul alege un număr aleatoriu de 128 de biți $x$ și un factor de orbire de 128 de biți $r_x$, și trimite angajamentul $c_x = H(x \,||\, r_x)$ către client.
  2. Clientul alege un număr aleatoriu de 128 de biți $y$ și îl trimite la server. (Nu este necesar niciun angajament aici.)
  3. Hash-ul serverului $x$ și $y$ împreună pentru a obține o sămânță de 128 de biți $s = H(x \,||\, y)$.
  4. Serverul folosește $s$ ca o sămânță pentru un PRNG determinist și folosește ieșirea PRNG pentru a amesteca determinist pachetul.
  5. Jocul se joacă cu pachetul amestecat.
  6. La sfârșitul jocului, serverul dezvăluie $x$ și $r_x$, permițând clientului să verifice dacă pachetul a fost amestecat corect (și nu a fost modificat după ce a fost amestecat).

Rețineți că serverul poate sa încă trișează, într-un fel, inspectând pachetul amestecat după pasul 4 și întrerupând jocul (de exemplu, pretinzând că conexiunea a fost întreruptă) dacă nu-i place pachetul. Astfel, un client ar trebui să fie suspicios față de serverele care întrerup frecvent conexiunile între pașii 2 și 5, sau chiar în timpul jocului de la pasul 5. În mod ideal, ar trebui să existe o modalitate ca un client să solicite unui server să reia un joc întrerupt în orice moment, iar un client ar trebui să fie foarte suspect de serverele care refuză să facă acest lucru.

(Implementarea în siguranță a unui astfel de mecanism de reluare într-un mod care funcționează chiar dacă serverul se blochează și uită starea jocului pare fezabilă, dar probabil în afara domeniului de aplicare al acestui răspuns. Pune o nouă întrebare dacă ești interesat.)

De asemenea, rețineți că valoarea orbitoare $r_x$ nu este de fapt necesar aici, din moment ce $x$ ea însăși are deja suficientă entropie pentru a face angajamentul de forțare brută imposibil de realizat. De fapt, ar fi puțin mai sigur să omiteți $r_x$ și doar fă $x$ în sine 256 în loc de 128 de biți.

Lungimile biților de $y$ și $s$ poate fi, de asemenea, crescut dacă se dorește; 128 de biți este doar un minim sigur și practic. Nu are rost să faci $s$ mai mare decât lungimea combinată a $x$ și $y$ împreună, totuși.

Toby Speight avatar
drapel in
Acest lucru este bun - ajută la rezolvarea problemei din întrebarea (îngropată bine prin asumarea unui algoritm de hashing _de încredere) cu privire la posibilitatea ca serverul să genereze coliziuni de hash dacă ajunge să-și aleagă propria sămânță complet liber.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.