[Alg] Meest efficiënte verdeling van K-out-of-N deelsleutels

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Dit is een wat meer theoretische vraag waarin ik me voor de lol gewoon in aan het verdiepen ben.

Ik kwam erop vanwege deze stackexchange post. De vraag daar is hoe je het best een bitcoin wallet seed kan verdelen over N plekken/mensen, waarbij er tenminste K deelsleutels nodig zijn om de seed te recoveren. Even ter achtergrond, dit doe je bijvoorbeeld om je wallet seed (die toegang geeft tot al je coins) veilig te verdelen over verschillende plekken, zodat je niet alles kwijt bent op het moment dat een deel verloren raakt, en een dief ook niet aan de haal kan gaan met slechts 1 deel. Met een 2-out-of-3 verdeling verdeel je de seed dus over 3 plekken, waarbij er tenminste 2 nodig zijn om de juiste informatie te reconstrueren.

Welnu, het gaat me niet zozeer om dat specifieke probleem en ik ben bekend met Shamir Secret Sharing om dat probleem op te lossen. In het antwoord waarnaar ik zojuist verwees wordt een alternatief voor SSS aangedragen, namelijk het verzinnen van een aantal sets van K-1 random deelsleutels dmv een one time pad, die samen met het berekende K'e deel het geheim onthullen (bijvoorbeeld door de boel bij elkaar te XOR'en). In de betreffende post wordt uitgegaan van S combinaties van K mensen uit in totaal N (met S = (NK) = N! / K! / (N-K)!), waarbij je dus S sets van K deelsleutels maakt die je uitdeelt aan iedere combinatie van mensen.

In het geval van 2-out-of-3, dus K=2 en N=3, dan heb je dus 3 personen: P1, P2 en P3, en in totaal 3 combinaties van 2 personen: { P1, P2 }, { P1, P3 }, { P2, P3 }. Voor elke combinatie maak je twee deelsleutels Ai en Bi, die je uitdeelt aan de mensen in elke combinatie.

P1: A1, A2
P2: B1,     A3
P3:     B2, B3


Hier is duidelijk te zien dat elke combinatie van 2 mensen hun eigen set met deelsleutels krijgt, waardoor er dus 3 sets nodig zijn. Echter, dit is niet de meest efficiente oplossing. Het kan ook met 2:

P1: A1, A2
P2: B1, A2
P3: A1, B2


In dit specifieke voorbeeld hoeft P3 niet eens A1 te weten, maar laten we dat negeren want het is wel handig dat hij die A1 heeft op het moment dat er een P4 bij komt. Want voor K=2 is gemakkelijk aan te tonen dat het aantal sets dat je nodig hebt gelijk is aan S = ⌈2log N⌉. Het patroon dat ontstaat is het welbekende bitpatroon. Je kunt het aantal personen verdubbelen door simpelweg de huidige verdeling 2x te herhalen, en dan het eerste deel alleen A te geven van een extra set, en het tweede deel alleen B.

Voorbeeld:
P1: A1 -> P1: A1, A2 -> P1: A1, A2, A3
P2: B1    P2: B1, A2    P2: B1, A2, A3
          P3: A1, B2    P3: A1, B2, A3
          P4: B1, B2    P4: B1, B2, A3
                        P5: A1, A2, B3
                        P6: B1, A2, B3
                        P7: A1, B2, B3
                        P8: B1, B2, B3


Wat hier gebeurt is natuurlijk vrij simpel te beschrijven. Elk groepje van twee krijgt zijn twee deelsleutels A en B uit de eerste set. Om ervoor te zorgen dat twee paren die samen een kwartet vormen ook altijd kunnen combineren, maak je een extra set waarbij de twee in het eerste paar beide A krijgen, en de andere beide B. Op die manier kunnen elke twee willekeurige mensen uit het kwartet met elkaar combineren. Dat een stapje verder naar een octet, door het eerste kwartet een A te geven van een nieuwe set sleutels, en het tweede kwartet een B. Dit kun je blijven herhalen, en elke keer wordt de groep 2x zo groot. Voor 2 uit de N mensen heb je dus ⌈2log N⌉ sets nodig.

En nu gaan we een beetje richting mijn vraag: wat nu als K=3. Elke set heeft dan natuurlijk 3 deelsleutels, A, B en C. In hetzelfde stackexchange topic staat een post die voorborduurt op de eerdere aangehaalde post en komt met een voorbeeld van 3-out-of-5. Er zijn dan 10 combinaties van mensen mogelijk, en hij komt dan ook met een oplossing die 10 sets van deelsleutels vereist, waarbij elke persoon 6 deelsleutels krijgt.
P1: A1, A2, A3, A4, A5, A6     
P2: B1, B2, B3,             A7, A8, A9
P3: C1,         B4, B5,     B7, B8      A10
P4:     C2,     C4,     B6, C7,     B9, B10
P5:         C3      C5, C6,     C8, C9, C10


Hieraan is al snel te zien dat dit veel efficienter kan door dubbelen te collapsen. Zo krijgen P1 en P2 allebei resp. de A en de B van sets 1, 2 en 3. Dan kun je daar ook wel 1 set van maken, door P4 en P5 ook een C1 te geven ipv resp. een C2 en een C3. Deze reductiemethode kun je blijven herhalen totdat er zoiets uitkomt:

P1: A1, A2, A3                                
P2: B1, A2, A3                 
P3: C1, B2, A3               
P4: C1, C2, B3         
P5: C1, C2, C3    


Tadaa, in totaal zijn er maar 3 sets nodig.

Hier ontstaat ook meteen een mooi patroon. Zie die diagonaal van de B. En inderdaad, dit idee is uit te breiden naar elke N. Het schaalt echter lineair ipv logaritmisch: S = N - 2.

Ik heb een programmaatje geschreven dat zoekt naar de minimale S gegeven K en N. Hieruit blijkt dat bovenstaande oplossing niet efficienter kan voor N=4 en N=5. Maar het zou ook betekenen dat bij N=6 je 4 sets nodig hebt, en dat is dus niet zo. Hier is een gevonden oplossing voor N=6 met 3 sets:

P1: A1, A2, A3                                   
P2: A1, B2, B3                                   
P3: B1, A2, C3                                   
P4: B1, C2, B3                                   
P5: C1, B2, C3                                   
P6: C1, C2, A3


Verder blijkt dat voor N=7 t/m 9 er minimaal 4 sets nodig zijn. Hier is de oplossing voor N=9
P1: A1, A2, A3, A4
P2: B1, B2, B3, A4
P3: C1, C2, C3, A4
P4: B1, C2, A3, B4
P5: B1, A2, C3, C4
P6: C1, A2, B3, B4
P7: A1, C2, B3, C4
P8: A1, B2, C3, B4
P9: C1, B2, A3, C4


Ik heb verder een oplossing voor N=10 met 5 sets, maar ik heb nog niet bewezen dat het niet kan met 4 sets; hij staat nog te rekenen. Ik vermoed echter dat dat niet mogelijk is.

Welnu, dan mijn daadwerkelijke vragen:
:? Wat is een systematische manier om een oplossing met minimale S te construeren bij willekeurige N bij K=3?
:? En in het verlengde daarvan, kun je dat doortrekken naar een willekeurige K?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Een exhaustive search voor K=3, N=10 heeft uitgewezen dat S=4 niet kan. Hier is een S=5 oplossing:
P1:  A1, A2, A3, A4, A5
P2:  B1, B2, B3, B4, B5
P3:  C1, B2, A3, B4, A5
P4:  A1, C2, B3, B4, A5
P5:  B1, C2, A3, C4, C5
P6:  C1, A2, B3, C4, C5
P7:  B1, A2, C3, B4, A5
P8:  C1, C2, C3, A4, C5
P9:  A1, A2, A3, C4, B5
P10: A1, B2, C3, C4, C5


Dit geeft de volgende minimale waardes van S bij K=3
 N min(S)
 3  1
 4  2
 5  3
 6  3
 7  4
 8  4
 9  4
10  5


Het ziet er wel een beetje logaritmisch uit. Helaas is N=9 wel een beetje de limiet van wat mijn huidige search algo in korte tijd kan beantwoorden. Er zit nog wel wat rek in want hij is nu nog single core en ongeoptimaliseerd, en op de GPU kan het waarschijnlijk nog makkelijk 2 ordes van grootte sneller maar waarschijnlijk valt er meer winst te halen uit het slimmer maken van de search zelf.

Bij K=4
 N min(S)
 4  1
 5  3
 6  5
 7  6
 8  6
 9  7?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • +1 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het zou kunnen zijn dat het een bekend combinatorisch probleem is, het lijkt op sommige dingen, maar ik weet even niet welke. Is er een andere praktische toepassing? Het doet me denken aan de 7 keys van dnssec maar Shamir Secret Sharing is logischer bij deze toepassing.

Als je kijkt naar de oplossing met 9, dan lijkt het erop dat die gegenereerd zou kunnen worden als je de boel wat verwisseld:
P1 (P1): A1, A2, A3, A4
P2 (P8): A1, B2, C3, B4
P3 (P7): A1, C2, B3, C4
P4 (P5): B1, A2, C3, C4
P5 (P2): B1, B2, B3, A4
P6 (P4): B1, C2, A3, B4
P7 (P6): C1, A2, B3, B4
P8 (P9): C1, B2, A3, C4
P9 (P3): C1, C2, C3, A4

Dat ziet er zo mooi uit dat je zou kunnen denken dat er wellicht eenzelfde oplossing is bij N=12 met S=5. En waarbij de N=10 oplossing dan wordt gevormd door 2 rijen daaruit weg te gooien. Als ik het probleem goed snap tenminste.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
pedorus schreef op maandag 23 november 2020 @ 20:46:
Als je kijkt naar de oplossing met 9, dan lijkt het erop dat die gegenereerd zou kunnen worden als je de boel wat verwisseld:
Klopt, dat had ik idd ook gezien. Hetzelfde zie je gebeuren bij N=6:

P1: A1, A2, A3                                   
P2: A1, B2, B3                                   
P4: B1, C2, B3                                   
P3: B1, A2, C3                                   
P5: C1, B2, C3                                   
P6: C1, C2, A3


Het grappige is dat bij N=9, de 3e en 4e set om de 3 alle permutaties van (A,B,C) aflopen. En bedenk trouwens dat je in een set keys de A, B en C sowieso vrij kunt permutteren. Ik heb er dit van gemaakt:
    S1  S2  S3  S4
P1: A1, A2, A3, A4
P2: A1, B2, B3, B4
P3: A1, C2, C3, C4
P4: B1, A2, C3, B4
P5: B1, B2, A3, C4
P6: B1, C2, B3, A4
P7: C1, A2, B3, C4
P8: C1, B2, C3, A4
P9: C1, C2, A3, B4


Als we dat even logisch benaderen. Je hebt 3 groepjes van 3. We noemen de groepjes even G1 (met P1..P3), G2 (P4..P6) en G3 (P7..P9). Binnen elk groepje kunnen ze combineren, dus ze hebben allemaal een A,B,C uit een set. Dit is S2 uit bovenstaande tabel.

Dan kun je nog 1 uit ieder groepje nemen, dus je geeft allen in G1 een A van een tweede set, G2 een B, G3 een C. Dit vormt S1.

Verder kun je nog 2 personen uit een groep en 1 persoon uit een andere groep bij elkaar pakken. Dat kan in totaal op 6 manieren. Als voorbeeld, als je P1 en P2 pakt, dan kunnen die standaard al combineren met P6 en P9 op basis van S2, dus die zijn covered. Om ze te kunnen combineren met P4 en P7 maak je een extra set (S3), waarvan je P4 en P7 de C geeft (en P1 en P2 natuurlijk A en B ). Voor P5 en P8 doe je hetzelfde met weer een extra set (S4). En waarschijnlijk wil je de C's bij P7 en P8 wel omdraaien, omdat je anders in de knoei komt bij bijvoorbeeld (P4 + P5 + P7).

Met de boel ingevuld wat we tot nu toe hebben gedaan, kom ik op
G1 P1: A1, A2, A3, A4
G1 P2: A1, B2, B3, B4
G1 P3: A1, C2,   , 
G2 P4: B1, A2, C3,  
G2 P5: B1, B2,   , C4
G2 P6: B1, C2,   , 
G3 P7: C1, A2,   , C4
G3 P8: C1, B2, C3,
G3 P9: C1, C2,   ,   


En dan kun je de rest eigenlijk ook makkelijk invullen, waarbij je zorgt dat in elk groepje altijd een A, B en C aanwezig is voor elke set, en ze bovendien niet overlappen per persoon. Hier heb ik de overlap overigens wel in G1, maar dat hoeft volgens mij niet per se.

Sterker nog, als je zorgt dat in elk blokje van 3x3 binnen een groep, er een A, B en een C is in elke rij en elke kolom, waarbij je bovendien zorgt dat geen 2 groepen dezelfde permutatie gebruiken, dan heb je een goede oplossing.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Nee, dat laatste klopt niet helemaal. Hoe willekeurig ik 'm ook invul, een goede oplossing heeft altijd 1 groepje met dezelfde (A,B,C) permutatie voor S2 t/m S4.

Ik vraag me nu even af of dit door te trekken is naar N=27 door dit trucje te herhalen. Mijn stelling is dat voor N=27 er 7 sets nodig zijn.

Elke 3 groepen cluster je in 3 grotere clusters H1..H3. Je hebt weer een mogelijkheid dat je uit elke cluster "dezelfde" persoon pakt (dus bijv. P1+P10+P19), dus je geeft iedereen in H1 een A, etc. En daarnaast heb je nog de case waarbij je 2 willekeurige mensen uit een cluster combineert met een "dezelfde" persoon uit een andere cluster (bijv. P1+P2+P10), dus daar heb je 2 extra sets voor nodig.

En zo verder: bij N=81 krijg je S=10

Voor elke vermenigvuldiging van het aantal mensen met 3, heb je 3 extra sets nodig.
Oftewel, min(S) = ⌈3∙(3log N - 1) + 1⌉ = ⌈3∙(3log N) + 2⌉, in ieder geval voor de gevallen waarbij N een macht van 3 is.

[ Voor 5% gewijzigd door .oisyn op 25-11-2020 02:10 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.