Passwörter teilen und wiederherstellen

This page in English

Ups! Diese Seite braucht JavaScript, und es scheint, dass JavaScript nicht aktiviert ist. Vielleicht möchtest Du einen anderen Browser verwenden? Oder es liegt daran, dass irgendwie der JavaScript Teil abhanden gekommen ist.

Wenn Du von jemandem für Notfälle einen verschlüsselten Teil eines Passworts bekommen hast, dann hat diese Person hoffentlich weitere Teile bei weiteren Personen oder an sinnvollen Orten hinterlegt. Sobald Du drei unterschiedliche Teile hast, kannst Du auf dieser Seite das Passwort rekonstruieren - natürlich nur, wenn es mit dem auf dieser Seite beschriebenen Verfahren verschlüsselt und geteilt wurde.

Wenn Du ein Passwort hast, auf das im Notfall jemand zugreifen können soll auch wenn Du selbst nicht erreichbar bist, dann kannst Du auf dieser Seite das Passwort in mehrere Teile verschlüsselt aufteilen. Diese Teile kannst Du z. B. an Freunde weitergeben. Nur wenn mindestens drei Teile zusammengeführt werden, kann das ursprüngliche Passwort rekonstruiert werden.

Bei dem Verfahren wird nur einfache Mathematik verwendet, so dass man zur Not die Berechnungen sogar mit Stift und Papier durchführen kann. Details und weitere Informationen findest Du im Abschnitt zur Theorie.


Ein Passwort aus drei Teilen wiederherstellen

Hier geht es nach oben zum Inhaltsverzeichnis.

Wenn Du von jemandem für Notfälle einen verschlüsselten Teil eines Passworts bekommen hast, dann hat derjenige hoffentlich weitere Teile bei weiteren Personen oder an sinnvollen Orten hinterlegt. Wenn Du drei unterschiedliche Teile hast, kannst Du hier das Passwort rekonstruieren - natürlich nur, wenn es mit dem auf dieser Seite beschriebenen Verfahren verschlüsselt und geteilt wurde.

- Status: Leer - Status: Leer - Status: Leer







Wenn sich Passwort-Daten und Validierungs-Daten unterscheiden, ist das angezeigte wiederhergestellte Passwort möglicherweise nicht korrekt. Mögliche Gründe für die Unterschiede sind, dass Teile kombiniert wurden, die nicht zueinander gehören, oder dass die Daten in den Teilen nicht komplett richtig vorliegen.


Ein Passwort verschlüsselt aufteilen

Hier geht es nach oben zum Inhaltsverzeichnis.

Wenn Du ein Passwort hast, auf das im Notfall jemand zugreifen können soll auch wenn Du nicht verfügbar bist, dann kannst Du hier das Passwort in mehrere Teile verschlüsselt aufteilen. Diese Teile kannst Du z. B. an Freunde weitergeben. Nur wenn mindestens drei Teile zusammengeführt werden, kann das ursprüngliche Passwort rekonstruiert werden.







Beispielbeschreibung:
Es handelt sich um Marias Benutzerdaten von 2023 bei ihrer Hausbank, geteilt mit ihren Angehörigen für Notfälle.

und scrolle dann nach unten.

Wenn Du Teile an andere weitergibst, dann gib' am besten eine Kopie dieser Seite mit. Sie ist so gestaltet, dass man sie einfach als Datei abspeichern und wieder öffnen kann und sie komplett ohne Internetverbindung funktioniert.


Die Theorie hinter dem Ganzen

Hier geht es nach oben zum Inhaltsverzeichnis.

Wenn Du ein Passwort hast, auf das im Notfall jemand zugreifen können soll auch wenn Du selbst nicht erreichbar bist, dann gibt es Möglichkeiten, das Passwort in mehrere Teile verschlüsselt aufzuteilen. Diese Teile kannst Du z. B. an Freunde weitergeben. Nur wenn mindestens eine bestimmte Anzahl von Teilen zusammengeführt werden, kann das ursprüngliche Passwort rekonstruiert werden.

Auf dieser Seite geht es um ein Verfahren und die Theorie dahinter, wenn zur Rekonstruktion drei Teile benötigt werden. Es gibt auch Verfahren, bei denen nur zwei Teile benötigt werden, und es gibt Verfahren, bei denen man die benötigte Anzahl der Teile frei wählen kann. Diese Verfahren sind aber nicht Thema dieser Seite. Ein bekannter Ansatz für "beliebige Anzahl" ist übrigens Shamir's Secret Sharing - weitere Informationen und eine Implementierung findest Du zum Beispiel hier: https://gdiet.github.io/secret-sharing/share-compact.html

Ein Gleichungsystem mit drei Unbekannten

Nehmen wir zunächst an, dass es nicht um ein Passwort geht, sondern um eine geheime Zahl s. Wenn ich ein Gleichungssystem mit drei Unbekannten habe, und davon ist eine s, dann kann ich ohne p und q zu kennen das Gleichungssystem nach s auflösen, wenn ich drei voneinander linear unabhängige Gleichungen habe.

Wenn p und q zwei Zufallszahlen sind, und die jeweils drei a, b und c Werte bekannt sind, dann kann man das folgende Gleichungssystem nach s auflösen:

a1 p+ b1 q+ c1 =s
a2 p+ b2 q+ c2 =s
a3 p+ b3 q+ c3 =s

Mit etwas Mühe oder einem Mathe-Programm erhältst Du folgende Lösung für s:

s=a1b3c2+a2b1c3+a3b2c1a1b2c3a2b3c1a3b1c2a1b3+a2b1+a3b2a1b2a2b3a3b1s = \frac{a_1b_3c_2 + a_2b_1c_3 + a_3b_2c_1 - a_1b_2c_3 - a_2b_3c_1 - a_3b_1c_2}{a_1b_3 + a_2b_1 + a_3b_2 - a_1b_2 - a_2b_3 - a_3b_1}

Jetzt kommt die Bedingung "drei voneinander linear unabhängige Gleichungen" ins Spiel: Wenn zum Beispiel a1 = a2 = a3 ist, dann ist der Nenner 0, und bei der Division haben wir ein Problem. Nur wenn der Nenner ungleich 0 ist, können wir s berechnen.

Folgende fünfzehn a/b-Paare haben die Eigenschaft, dass jede beliebige Kombination von drei a/b-Paaren voneinander linear unabhängig ist:

1/2 2/1 2/4 1/5 5/2 6/3 3/7 4/7 7/5 3/8 7/8 4/9 6/9 9/1 9/3
Diese Wertepaare habe ich mittels eines Programms ermittelt, das zufällige Kombinationen auf ihre Unabhängigkeit prüft:
val tuples = for {i <- 1 to 9; j <- 1 to 9} yield (i, j)
while (true)
  val selection = scala.util.Random.shuffle(tuples).take(15)
  if selection.combinations(3).forall {
    case Seq((a1, b1), (a2, b2), (a3, b3)) =>
      a1*b3 + a2*b1 + a3*b2 - a1*b2 - a2*b3 - a3*b1 != 0
  } then println(selection)
Weitere Wertepaare lassen sich ermitteln, interessieren hier aber erst mal nicht.

Das sieht soweit doch schon mal gut aus. Wir können bis zu 15 Personen je einen Satz voneinander unabhängiger a / b / c Werte geben, so dass es stets drei Personen braucht, um s zu rekonstruieren. Oder nicht?

Zusätzliches Wissen

Braucht es wirklich drei Personen, um Informationen über die geheime Zahl s zu bekommen? In der echten Welt ist das leider nicht immer der Fall. Das liegt daran, dass die Personen möglicherweise zusätzliches Wissen über p, q und s verwenden können. Wenn beispielsweise bekannt ist, dass p, q und s Bytes sind, also Zahlen im Bereich [0..255], und wenn ein c-Wert 255 ist, dann müssen die zugehörigen p/q Werte 0 sein und s = c. Oder wenn bekannt ist, dass nur ganze Zahlen in der Berechnung verwendet werden, und wenn bei einer Person a, b und c gerade sind, dann weiß diese Person, dass auch s gerade ist. Diese und ähnliche Überlegungen können verwendet werden, um aus nur einer oder zwei Gleichungen zumindest einige Erkenntnisse über den geheimen Wert s zu gewinnen.

Der Zahlenraum mod 257

Deshalb wenden wir einen Trick an: Wir führen alle Berechnungen modulo 257 - oder kurz: mod 257 - durch, was uns den Zahlenbereich [0..256] zum Arbeiten gibt - ein praktischer Raum, wenn wir mit Bytes arbeiten wollen.

Anstelle von 257 könnte man auch eine beliebige andere Primzahl verwenden. Mit mod 101 hätten wir zum Beispiel den Zahlenbereich [0..100], was je nach Anwendung auch sehr praktisch sein kann...

Für negative Zahlen bei Modulo verwenden wir hier die Regeln, dass

-x mod -y = +x mod +y
-x mod +y = +x mod -y = y - (x mod y)
ist, so dass der Modulo nie negativ ist. Beispiel:
-17 mod -7 = +17 mod +7 = 3
-17 mod +7 = +17 mod -7 = 7 - (17 mod 7) = 4

Wenn jetzt jemand zum Beispiel die Werte a = 2, b = 2, c = 2 kennt, dann hat er über s trotzdem keine zusätzlichen Informationen, weil

s = (a*p + b*q + c) mod 257
je nach dem Wert von p und q jeden Zahl im Bereich [0..256] sein kann.

Rechnen im Zahlenraum mod 257

Addition      : a + b im Zahlenraum mod 257 = (a + b) mod 257
Subtraktion   : a - b im Zahlenraum mod 257 = (a - b) mod 257
Multiplikation: a * b im Zahlenraum mod 257 = (a * b) mod 257
Division      : a / b im Zahlenraum mod 257 = ... ?
Die Division ist etwas aufwändiger: Es ist die Inverse der Multiplikation, also "finde die Zahl c, für die gilt: (b * c) mod 257 = a". Du berechnest c am einfachsten so: Prüfe, ob a ohne Rest durch b teilbar ist. Ist es nicht ohne Rest teilbar, dann addiere 257 zu a und prüfe erneut. Wiederhole diesen Vorgang, bis Du eine Zahl erhältst, die ohne Rest durch b teilbar ist. Das Ergebnis dieser Division ist die gesuchte Zahl c.
Für negative Zahlen gilt dabei:
-a / -b = +a / +b                      | im Zahlenraum mod 257
-a / +b = +a / -b = 257 - ( +a / +b )  | im Zahlenraum mod 257

Passwörter teilen

Richtig, das wollen wir ja eigentlich. Mit dem obigen Handwerkszeug geht das so:

Wenn Du zum Beispiel folgende Werte hast

a = 4, b = 7, p = 23, q = 218, s = 65
dann berechne
a * p + b * q + c = s     | mod 257
c = s - a * p - b * q     | mod 257
c = (65 - 4 * 23 - 7 * 218) mod 257
c = (-1553) mod 257
c = 257 - (1553 mod 257)
c = 257 - 11
c = 246

{
  "a": 4,
  "b": 7,
  "c": [236,6,124,109,87],
  "v": [125,177,78,85,40]
}

Passwörter wiederherstellen

Lizenz und weitere Informationen

(c) 2023 und später gdiet
Lizenz: MIT Lizenz

Stand des Dokuments:
17.06.2025
https://github.com/gdiet/secret-sharing/commit/a280212f

Anstelle von "weitere Informationen": Möchtest Du vielleicht
den Quellcode dieser Seiten auf GitHub anschauen?