Puncte:-1

Debordează în schema clasică Shamir Secret Sharing

drapel co

Am implementat schema clasică de partajare a secretelor Shamir, care arată astfel:

  • obțineți parola ca intrare (orice lungime)
  • convertiți textul parolei în număr întreg mare
  • generați coefuri polinomiale (an ... a1)
  • generează divizări - perechi (xi, yi) cu pragul dat

Funcționează excelent și așa funcționează generarea mai multor cote de secrete:

  • obținerea acțiunilor și a pragului ca intrare
  • găsirea coefilor cu gauss (deci știu polinomul original)
  • găsirea valorii secrete <-- aceasta este problema
  • generarea mai multor acțiuni - folosind timestamp ca xi

Totul funcționează bine, dar când folosesc parole lungi (10 caractere și mai mult) când reconstruiesc valoarea secretă, poate eșuează pentru că și-a pierdut precizia pentru numere mari.

Deci, cum să depășești această abordare clasică? Ce ar trebui schimbat în schemă ca să nu fie sensibilă la lungimea textului secret?

kelalaka avatar
drapel in
https://math.stackexchange.com/q/4329986/338051 și aceasta se transformă într-o problemă de parametri și codificare care se potrivește mai mult în [așa].
Vadym Fedyukovych avatar
drapel in
Ați folosit un câmp finit pentru a vă reprezenta parolele?
Macko avatar
drapel co
@VadymFedyukovych nu încă, vă rugăm să oferiți câteva opțiuni cum să faceți acest lucru corect? Cum se codifică parola în câmpul finit eșantion
Puncte:1
drapel my

Ce ar trebui schimbat în schemă ca să nu fie sensibilă la lungimea textului secret?

Ei bine, Vadym a menționat deja că Shamir Secret Sharing ar trebui să se facă într-un câmp finit; cu toate acestea, nu răspunde la întrebarea dvs.

Cu Schema lui Shamir, o singură instanță poate împărtăși orice valoare între $0$ și $p^k - 1$ (Unde $p^k$ este dimensiunea câmpului finit pe care îl utilizați [1]). Și, cu Shamir, nu există nicio diferență de securitate între diferitele câmpuri finite, prin urmare putem alege unul pe baza preocupărilor practice (de exemplu, numărul de secrete pe care doriți să le puteți emite, dimensiunea secretului, ușurința de a implementa diverse operaţii în câmp finit).

Totuși, ceea ce vrei să faci este să partajezi o parolă ca secret; acea parolă este destul de lungă și este de lungime variabilă. Ei bine, există două alternative evidente:

  • Alegeți o $p^k$ (sau prim $p$ daca mergi cu $k-1$) care este suficient de mare pentru a deține orice parolă pe care doriți să o partajați; de exemplu, dacă utilizați $p=2^{521}-1$ (care este principal), puteți partaja parole de până la 65 de caractere. Acest lucru funcționează, dar dezavantajul este că valorile atât de mari ar trebui să fie tratate cu o bibliotecă bignum. Dacă utilizați un limbaj cu o bibliotecă bignum încorporată (de exemplu, Python), aceasta nu este o problemă - dacă nu, probabil că ar fi mai ușor să mergeți cu a doua idee.

Cu această idee, dacă am avea parola „letmein” (0x6c 0x65 0x74 0x6d 0x65 0x69 0x6e în ASCII), am putea codifica asta ca întreg 0x6c65746d65696e = 30510848210725

  • Împărțiți parola în mai multe secrete și partajați fiecare secret separat. De exemplu, pentru o parolă de 14 caractere, o putem împărți în 14 secrete separate (fiecare secret fiind un caracter din parolă) și împărtășim fiecare caracter folosind $p=257$ și $k=1$ (deci fiecare parte ar primi un total de 14 acțiuni, câte o acțiune pentru fiecare dintre cele 14 caractere). Cu această idee, este sigur să folosiți același identificator pentru toate acțiunile pe care le primește o parte; cu toate acestea, este important ca fiecare secret să fie generat folosind aleatorie independentă (adică fiecare dintre cele 14 polinoame aleatoare este generat separat).

Cu această idee, am codifica parola „letmein” ca cele 8 secrete independente 0x6c 0x65 0x74 0x6d 0x65 0x69 0x6e

Cu această a doua idee, dacă nu doriți să scurgeți lungimea secretului, ceea ce puteți face este întotdeauna să partajați un număr fix de secrete (care va fi lungimea maximă a parolei pe care o puteți partaja, să zicem, 32) și pentru parole mai scurte decât atât, completați caracterele secrete suplimentare cu o valoare care nu poate apărea într-o parolă reală (de exemplu, $p=257$, valoarea evidentă de utilizat ar fi $256$).


[1]: Pentru orice prim $p$ și orice număr întreg $k$, există un câmp finit de dimensiune $p^k$. Probabil că ți-ar fi mai ușor să începi să folosești un câmp cu $k=1$ și $p$ un prim de dimensiune adecvată - acest lucru face ca operațiile de adunare, scădere și înmulțire să fie mult mai apropiate de algoritmii standard cu care ești familiarizat (diviziunea este încă neplăcută).

Macko avatar
drapel co
hmm, a doua idee mi se pare cam ciudată pentru că fiecare parte care primește acțiuni nu ar trebui să aibă suficiente acțiuni pentru a reconstrui parola protejată (secretă). În al doilea rând, nu înțeleg cum partajarea caracterelor unice ale parolei ar putea fi ulterior reconstruită la o parolă de lungime completă. Această abordare pare mai elastică.
Macko avatar
drapel co
Se pare că prima abordare este o opțiune bună, dar are nevoie de câteva încercări și erori pentru a găsi un punct favorabil al structurilor utilizate intern - pentru a afla cât de lungă sau complexă poate fi încă procesată de un algoritm scris.
poncho avatar
drapel my
@Macko: dacă nu înțelegi a doua idee, te gândești prea mult la ea. Cu acesta, generați o schemă de partajare secretă pentru prima literă și distribuiți acele acțiuni. În paralel, generați un ss pentru a doua literă și distribuiți acele acțiuni aceleiași părți și același lucru pentru a treia, a patra, etc. Când vine timpul să recombineți, luați toate acțiunile pe care le au părțile și combinați primele lor acțiuni împreună (pentru a genera prima literă); la fel cu al doilea, etc. Odată ce ai toate literele, concatina-le împreună și ai terminat.
Macko avatar
drapel co
Cred că a doua opțiune este supraproiectarea și petrecerile vor ajunge cu prea multe acțiuni care ar fi greu de gestionat. Voi rămâne cu opțiunea clasică 1 deocamdată...
Puncte:0
drapel in

Din descrierea dată, s-ar putea sugera că numerele zecimale și operațiile cu virgulă mobilă ar fi o soluție simplă. Nu există depășiri și probleme de precizie cu câmpuri finite.

Vă rugăm să luați în considerare aritmetica modulo un număr prim, redefiniți standardul c++ plus, minus, înmulțire și împărțire. Alegeți un manual pe care îl puteți citi. E un drum lung. Noroc.

Macko avatar
drapel co
Bineînțeles că aveți dreptate, dar am nevoie de mai multe detalii sau de confirmare cum să o fac corect: mai întâi codificați parola la un număr mare (în Java ar fi BigInteger), apoi convertiți această valoare în număr într-un câmp finit? De acum înainte toate calculele cum ar fi (generarea coefurilor, interpolarea) ar trebui să se facă numai în câmpul definit?

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.