Moinmoin Gemeinde,
@ hannes
Das Verschieben ins Plausch-Forum hätte vielleicht zur Folge, daß
auch andre Leute, die mit 'Algorithmen' per se nichts zu tun haben,
die eine oder andre lustige Idee beisteuern.
Den thread zu schliessen fänd ich ganz und gar falsch und schade,
denn er enthält soviel Lehrreiches. Es werden hier ne ganze Reihe
von allgemein wichtigen Dingen berührt - Probleme, die in vielen
Foren, vielen Fragen, vielen Antworten immer wieder auftauchen.
Die Schönheit liegt natürlich im Auge des Betrachters...
Doch zunächst einmal back to the roots:
Da sucht jemand ein Programm (kostenlos), das ihm irgendeine
Aufgabe erledigen soll.
Mich persönlich intressiert so eine Frage gar nicht. Entweder
kenn ich so ein Programm (dann werd' ich's, hilfreich, wie ich
bin, geflissentlich zu Protokoll geben), oder ich kenn nicht so
ein Programm, dann kann ich dazu nichts sagen.
Mich intressiert im Rahmen dieses Forums, wie ein solches Programm
geschrieben werden kann.
Und das ist auch die einzig relevante Frage, weil nämlich Programme,
die genau diese konkrete Aufgabe lösen, in der Regel nicht kostenlos
irgendwo rumliegen (Es gibt die zwar, doch nicht einfach so zum legalen
Downloaden, es sei denn, in abgespeckter Form, als Anschauungsmaterial).
Doch nun in medias res:
sometimes hatte zu Beginn der Reise drei Datensätze gepostet.
Inzwischen hat er die wieder wegeditiert, warum auch immer.
Zum einen sind drei Datensätze viel zu wenig, um ein eventuell
zutreffendes Vorgehen mit höherer Wahrscheinlichkeit zu
entwickeln, zum andern ist ein System mit einer Beschränkung
auf 10.000 verschiedene pwds (erste Arbeitshypothese von mir,
die ich aus diesen drei mir bekannten Datensätzen ableite)
sowieso nicht Fort Knox.
Eine weitere wichtige Information war dann, daß die Lehrer
ein pwd im Kopf ausrechnen können.
Was haben wir also ?
Drei Datensätze, und eine Zusatzinformation.
Sonstnochwas ?
Nein, abgesehn von einer handvoll beliebiger Annahmen:
nun.. vielleicht hilft es ja schon weiter, wenn wir euch sagen, dass
das Passwort mit 99,9% Wahrscheinlichkeit folgende Daten benötigt:
- die länge des vornamens
- die länge des nachnamens
- die positionen der buchstaben des namens im alphabet
- das geburtsjahr
Ausgehend von unsrem einzigen tatsächlich hilfreichen Fakt,
nämlich der im-Kopf-Berechenbarkeit, sind die letzen beiden
Punkte eher unwahrscheinlich (es sei denn, der Lehrer fragt den
betreffenden Schüler jedesmal vor seiner Hirnakrobatik nach
dem Geburtsjahr - denn daß die Lehrer alle Geburtsjahre der
Schüler auswendig parat haben, ist nicht anzunehmen, und
selbst wenn diese Frage jedesmal gestellt würde, könnte
sie genauso gut einer irrsinnig gewitzten Irreführung dienen.
Hinzu kommt, daß das Geburtsjahr in einer Stufe kaum mehr
als um 1 differiert, weswegen es sich nicht unbedingt zur Erzeugung
_verschiedener_ pwds anbietet.
Die Position eines Buchstabens im Alphabet ist zwar eine Möglichkeit -
wie alles andre auch - und für einen Computer ein Klacks, aber
wahrscheinlich fürs schnelle Kopfrechnen ein bissel umständlich.).
Um einem Programm, das mögliche Algorithmen aus den Namen
generiert, die Arbeit zu erschweren, könnte man stattdessen
hergehen und Parameter einführen, die einem Menschen sich
_sofort_ erschliessen, für ein Programm aber so einfach
nicht zugänglich sind. Zwei einfache Möglichkeiten:
1.) Die Anzahl der Silben.
2.) Das Geschlecht.
Im folgenden ein möglicher Algorithmus, der diese beiden
Kriterien benutzt:
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html>
<head>
<title>ultimater_pwd_cracker</title>
<meta http-equiv='content-type' content='text/html; charset=iso-8859-1'>
<script type='text/javascript'>
A = [['Georg Baumann', 0, 2, 2],
['Kathrin Gassmöller', 1, 2, 3],
['Andreas Balzer', 0, 3, 2],
['Anton aus Tirol', 0, 2, 2],
['Glöckner von Notredam', 0, 2, 3],
['Mausi Zahn', 1, 2, 1],
['Klausi Lahm', 0, 2, 1],
['Walther von der Kuhweide', 0, 2, 3],
['Watz Mann', 0, 1, 1],
['Frau Bolle', 1, 1, 2],
['Neander Tal', 0, 3, 1],
['Mäander Bach', 0, 3, 1]
];
O = [];
function P(){var S = function(o, s){return o.toString().match(s ? /d$/ : /d/) * 1};
for (var i in A)
{vl = A[i][0].match(/^s*(S+)/)[1].length;
nl = A[i][0].match(/(S+)s*$/)[1].length;
gs = A[i][1];
// vs = A[i][2];
ns = A[i][3];
m4m = 10 % nl * nl;
m4a = S(m4m, 0);
m4e = S(m4m, 1);
m4 = m4e;
m3 = S(vl * 2 + m4a, 1);
m2 = S(ns + (gs ? 1 : - 1));
m1 = S(vl * 2 - nl, 1);
O[i] = [A[i][0], ' => ', m1, m2, m3, m4].join('');
};
alert(O.toString().replace(/,/g, 'n'));
};
onload = P;
</script>
</head>
<body>
</body>
</html>
Ein Datensatz enthält den Namen, das Geschlecht, Anzahl der Silben des
Vornamens, Anzahl der Silben des Nachnamens.
Die pwds für Georg Baumann, Kathrin Gassmöller, Andreas Balzer waren
vorgegeben.
Von Bedeutung sind nur das erste und letzte Wort des Namens, dh. in
'Anton aus Tirol' zählen nur 'Anton' und 'Tirol'.
Weil ich nicht vorhabe, die Sicherheit eines Erfurter Schulnetzwerks
zu kompromittieren, habe ich ein Beispiel gewählt, daß mit 101%tiger
Wahrscheinlichkeit die Aufgabe nicht löst - es erzeugt schlicht und
wenig ergreifend einfach zu viele mehrfache Vorkommen eines pwds.
Es soll allerdings der Anschauung dienen:
Ein vierstelliges pwd wird in vier Stellen unterteilt, die gesondert
berechnet werden, und dann zusammengesetzt. (Eine der vielen
verschiedenen Möglichkeiten).
Die letzte Stelle ergibt sich aus 10 modulo Länge des Nachnamens,
multipliziert mit ebendieser Länge. Von dieser Zahl wird aber
nur die letzte Ziffer verwendet, die erste Ziffer, die sich
möglicherweise von der letzen unterscheidet, wird aufgehoben, und
fliesst in die Berechnung der dritten Stelle ein.
Diese dritte Stelle ergibt sich aus der Addition der doppelten
Länge des Vornamens mit besagtem aufgehobenen Wert, wobei auch hier
die letzte Ziffer dieses Ergebnisses verwendet wird.
Bei der zwoten Stelle wird in Abhängigkeit vom Geschlecht zur Anzahl
der Silben des Nachnamens entweder 1 addiert oder subtrahiert.
Und last but very not least wird die erste Stelle errechnet, indem
die Länge des Nachnamens von der doppelten Länge des Vornamens
abgezogen wird, wobei von diesem Wert ebenfalls bloß die letzte
Ziffer verwendet wird.
Ich habe dieses Beispiel der Einfachheit halber in javascript notiert,
damit es für alle, die hier vielleicht mitlesen, leicht verständlich ist.
Ein Programm zur Erzeugung solcher Abläufe wird man wahrscheinlich nicht
in javascript schreiben. Aber eine Diskussion darüber ist, zumindest
beim jetzigen Stand der Dinge, eh müssig.
Wichtig war mir der Hinweis darauf, daß es mit hoher Wahrscheinlichkeit
Parameter gibt, die von einem Programm nicht errechnet werden können,
sondern bestenfalls in einer optionalen range simuliert.
Für einen Menschen, der das Vorgehen kennt, ist es nicht schwierig,
die Berechnung im Kopf vorzunehmen. Für ein Programm kann es deutlich
"heavy load" sein.
gruß an alle
+ ein spezieller an - na wen wohl ? - schwarznase
matho