April 23rd, 2010

Was ik een tijdje geleden nog overtuigd dat ik op basis van een 72 karakter tellende set, alle combinaties tot en met 8 letters zou genereren, nu is dat wel iets anders.  Het totaal aantal wachtwoorden komt neer op toch nog zo’n 1.235.736.291.547.681 stuks . Zou mijn applicatie er (op mijn laptop) 1 milliseconde over doen om een wachtwoord te genereren, dan duurt het volledige proces ruim 39.184 jaar. Ik geloof dat ik zo lang niet leef.

Dus…Terug naar het kraken van mijn beveiligde zipje. De focus ligt momenteel op het genereren van variaties op een bekend wachtwoord. En dat bleek minder complex dan verwacht; want in plaats van de code voor het genereren van alle mogelijke combinaties op basis van een 72 karakters tellend setje, zijn de mogelijk heden nu behoorlijk beperkt tot het aantal mogelijke variaties op basis van de ‘begin letter’ de originele letter van het bekende wachtwoord.

Stel we hebben de naam ‘Emma’. De beschikbare variaties zijn:

  • ‘E’ : ‘e’,'E’,’3′ en ‘#’
  • ‘m’: ‘M’ en ‘m’
  • ‘a’ : ‘a’, ‘A’, ’4′ en ‘$’

Een behoorlijke verbetering als je bedenkt dat in het genereren van alle mogelijke combinaties voorheen uit moest worden gegaan van 72 opties en nu zijn dat er dus nog maar 2 of 4. Het mooie van deze aanpak is overigens dat ik ook de ‘a’ – ‘caps lock’ en ‘M’ – ” (leeg karakter) verwarring mee kan nemen. Zo zijn er voor alleen de ‘a’ en ‘m’ nog een extra optie. Een bijkomend voordeel van de verdeling van opties per letter is dat wanneer er een optie bij een letter komt, dit niet per definitie een verdubbeling van het aantal mogelijkheden betekend! Zo kan je tenminste nog eens experimenteren met mogelijke type fouten zonder gelijk enkele millenia te moeten wachten op resultaat.

De complete set mogelijke variaties voor mijn wachtwoord, EmmaTruitjeMaria, wordt zodoende:

  • ‘e’-> “e”,”E”,”3″,”#”
  • ‘a’-> “a”,”A”,”4″,”$”,”"
  • ‘m’-> “m”,”M”,”"
  • ‘t’-> “t”,”T”
  • ‘r’-> “r”,”R”
  • ‘u’-> “u”,”U”
  • ‘i’ -> “i”,”I”,”1″,”!”
  • ‘j’ -> “j”,”J”

Het lastige deel van het genereren van variaties was het beantwoorden van de vraag wanneer je klaar bent met het genereren van variaties? Met het genereren van bijv. 6 letter wachtwoorden op basis van alleen het alfabet is het makkelijk; als het wachtwoord ‘zzzzzz’ is, dan ben je klaar. Maar ben je wel klaar als je variatie op ‘Emma’ ‘#mm$’ is?
Gelukkig lag de oplossing in de code die ik al had: als het genereren van variaties weer terug komt bij het origineel, dan heb je ze allemaal gehad. Bij het testen van de code bleek dit ook het geval en had ik netjes de voorspelde 8.388.608 wachtwoorden gevonden.

Na een snelle aanpassing van de vorige code duurde puur het genereren van de variaties op het volledige, 16, letterige wachtwoord ongeveer 2.6 minuten. Dit was overigens nog zonder de ‘caps lock’ en extra ‘m’ opties. Alhoewel dit geen slechte prestatie is en voldoende bruikbaar voor mijn doeleinden, heb ik toch nog even aan mijn  code gesleuteld en de duur verkort tot 0.48 minuten voor de 8.388.608 wachtwoorden.

Het genereren van de variaties met de extra opties, wat neer komt op 55.296.000 wachtwoorden, duurde een schamele 12.6 minuten. Inclusief het wegschrijven van de wachtwoorden naar bestand.

Nu nog het uitlezen en daar wringt hem de schoen. Want in java duur het toch werkelijk een (1) seconde om een systeem commando uit te voeren. Zo wordt het testen van 16 of 55 mln. wachtwoorden toch nog een klus van minimaal 100 dagen, indien de computer 24 uur per dag, 7 dagen in de week aan staat.

Dat moet dus sowieso in een andere taal. Of gescript in Bash/Linux of met een wat vlotter aangelegde programmeertaal zoals, door een collega aangeraden, Python. Wel, boekje besteld en nu staat het project even stil totdat dit boekje gearriveerd is.
Ik kan ook op het web zoeken naar stukjes Python code, maar het is natuurlijk leuk om wat tastbaars aan dit project over te houden. Kan ik ook gelijk dat ander boek wat ik zo graag wilde mee bestellen. Beroof mij niet van mijn excuses!

Bij deze; de code van Variation

Tot slot nog de volgende gedachte; ik weet niet meer waar ik het ooit vandaan heb gehaald, maar ik weet wel dat het willekeurig (c – a – d – b) uitproberen van wachtwoorden een  (mogelijk) snellere slagingskans heeft dan lineair zoeken (a – b – c – d). Ik heb de code dus zo geschreven dat de 55 mln. wachtwoorden per 10.000 worden weggeschreven.
Per 1.000 resulteerde in zoveel bestanden dat zelfs Ubuntu begon te klagen en per 50.000 waren het te weinig om van een mogelijke willekeur te spreken.

En de volgende keer dus het toepassen van de wachtwoorden in Python.

 

 

Tags: , , , , , , ,