Vorwort:
Ich möchte hier ein System vorstellen, welches auf dem Additive Secret Sharing und XOR basiert, aber so abgewandelt wurde, dass es simpler auszuführen ist, ohne dabei die Sicherheit zu beeinträchtigen.
Das Ziel ist, es dem Anwender die Möglichkeit zu geben seine Seed Phrase (oder eine andere geheime Information) auf einem Blatt Papier ohne einen Computer aufzuteilen. Beim Shamir Secret Sharing benötigt man fast zwangsläufig Software um es umzusetzen.
Ich bin es mehrfach durchgegangen, habe es sowohl mit echten Menschen als auch mit KI besprochen und konnte bisher keinen Fehler finden.
Weil es hier aber um den Schutz hoch sensibler Daten geht, möchte ich darauf hinweisen, dass ich nicht für die Sicherheit des Systems garantieren kann, viel mehr möchte ich es hier besprechen und es gemeinsam analysieren, um die Sicherheit davon zu überprüfen.
Wenn ihr irgendeinen Fehler findet, eine Frage oder einen Vorschlag habt, dann schreibt es gerne :)
Das System
Vom Wort zu den Shares
- Wir starten mit einem Wort, z.B Bitcoin
- Das Wort Bitcoin wird zur Buchstaben Liste [„b“, „i“, „t“, „c“, „o“, „i“, „n“]
- Die Basis Werte dieser Buchstaben sind ihre Positionen im Alphabet: [2, 9, 20, 3, 15, 9, 14]
- Share 1 wird zufällig mit 4 Würfeln (0-9 / 10 seitig) generiert: [824, 9805, 9339, 3161, 2320, 4175, 5373]
- Share 2 [n] wird als Basis Wert [n] - Share 1 [n] definiert (z.B Basis Wert [1] - Share 1 [1] = Share 2 [1]
[−822, −9796, −9319, −3158, −2305, −4166, −5359 ] - Diese Schritte kann man mit jedem Wort der Seed Phrase wiederholen, bis man die ganze Seed Phrase aufgespaltet hat.
Von den Shares zu dem Ausgangs Wort
- Share 1 = [824, 9805, 9339, 3161, 2320, 4175, 5373]
- Share 2 = [−822, −9796, −9319, −3158, −2305, −4166, −5359 ]
- Share 1 [n] + Share 2 [n] = Basis Wert [n] (Wenn ihr das auf dem Papier macht könnt ihr die Rechenoperatione direkter interpretieren)
- Basis Werte = [2, 9, 20, 3, 15, 9, 14]
- Buchstabenliste = [„b“, „i“, „t“, „c“, „o“, „i“, „n“]
- Wort = Bitcoin
Anmerkungen
- Ich würfel mit 4 Würfeln, um die Wahrscheinlichkeit einer Kollision am Rand des Zahlenbereiches zu minimieren. Ich denke das Verwenden von 3 Würfeln wäre auch ok, 2 wären aber zu wenig.
- Man sollte 10 seitige Würfel verwenden, 0-9.
- Bei BIP39 Wörtern müsste man nicht das ganze Wort, sondern nur die ersten 4 Buchstaben sichern, um das Wort eindeutig identifizierbar zu machen.
- Man sollte die Wiederherstellung bei diesem (wie auch bei allen anderen Backup Verfahren) auf jeden Fall proben, um sicherzustellen, dass man alles richtig gemacht hat.
- Da, anders als beim Shamir Secret Sharing, beim Additive/Subtractive Secret Sharing jeder Teil benötigt wird, sollte man von jedem Teil mehrere Kopien an verschiedenen sicheren Orten haben.
Der Prozess in Code Form:
Für die unter euch, die coden können, habe ich hier die Darstellung des Prozesses als Code (noch in Entwicklung und unvollständig, weil ich hier nicht alles zu spamen möchte, betrachtet es als Demo) Bedenkt das sich [1] in der Beschreibung oben zu [0] im Code unten bezieht.
Wenn jemand Interesse am vollständigem Code hat, schicke ich den gerne.
def word_to_shares_core(word):
if word == None:
word = word_input()
base_value = letters_to_numbers(word)
share_1 = create_share_1()
share_2 = create_share_2(base_value, share_1)
global share_1_stack
global share_2_stack
share_1_stack.append(share_1)
share_2_stack.append(share_2)
print_shares(word, share_1, share_2)
def word_input():
word = input("word: ")
word = list(word)
return word
def create_share_1():
share_1 = [0,0,0,0]
share_1[0] = int(input("Roll 4 (ten sided) dices: "))
share_1[1] = int(input("Roll 4 (ten sided) dices: "))
share_1[2] = int(input("Roll 4 (ten sided) dices: "))
share_1[3] = int(input("Roll 4 (ten sided) dices: "))
return share_1
def create_share_2(base_value, share_1):
share_2 = [0,0,0,0]
share_2[0] = base_value[0] - share_1[0]
share_2[1] = base_value[1] - share_1[1]
share_2[2] = base_value[2] - share_1[2]
share_2[3] = base_value[3] - share_1[3]
print(share_2)
return share_2
def print_shares(word, share_1, share_2):
print("")
print(f"Word: {word} ")
print("Share 1: ", share_1)
print("Share 2: ", share_2)
print("")