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ă).