ROB Bowden: Mi Rob, kaj ni get krakas. Do memoras el la pset spec ke ni tuj estos neceso uzi la kripto funkcio. Por la viro paĝo, ni havas du hash difini _xopensource. Ne maltrankviliĝu pri tio ni devas fari tion. Kaj ankaŭ hash inkluzivas unistd.h. Do iam tio estas de la vojo, ni alveni ĝis la aktuala programo. Ni unue bezonas fari estas certiĝi la uzanto eniris validan ĉifrita pasvorton ĉe la komandlinio. Memoru ke la programo supozas esti fluigos kiel skalara oblikvo fendon, kaj tiam ĉifrita kordo. Do jen ni kontrolanta certigi ke argc al du se ni volas daŭrigi kun la programo. Se argc estas ne du, kiu signifas ĉu la uzanto ne eniris ĉifrita pasvorton ĉe la komandlinio, aŭ ili eniris pli ol nur la ĉifrita pasvorton ĉe la komandlinio, en kiu kazo ni ne scias kion fari kun la komandlinio argumentoj. Do se argc estis du, ni povas daŭrigi. Kaj tie, ni tuj rakontu variablo ĉifrita. Tio nur tuj alias la originala argv1 tiel ke tra ĉi programo, ni ne devas nomi ĝin argv1, kion do vi devos pensi pri kio fakte signifis. Do fine, ni volas validigi ke la ĉifrita pasvorto de la uzanto eniris povus esti vere estis ĉifrita pasvorto. Per la viro paĝo de kripto, la ĉifrita pasvorto devas esti 13 signojn longa. Ĝis ĉi tie, rimarki ke ni hash difinita ĉifri longon kiel 13. Do ni simple certigi, ke la korda longeco de la ĉifrita pasvorto estas 13. Kaj se ĝi ne estas, ni volas por eliri la programon. Do iam tio estas de la vojo, ni povas nun efektive provi trovi, kion la pasvorton kiu donis la ĉifrita pasvorto estis. Tie, ni volas kapti la salo de la ĉifrita pasvorto. Memoru, por la viro paĝo, ke la unuaj du gravuloj de ĉifrita ĉeno, kiel ĉi tie - 50ZPJ kaj tiel plu - la unuaj du karakteroj doni ni la salo, kiu estis uzata en la kripto funkcio. Kaj tie, ni vidas ke la salo estis ha. Do ni deziras kopii la unuaj du karakterojn, salo longo esti hash difinita kiel du. Ni devas kopii la unuaj du karakteroj en ĉi tiu tabelo, salo. Rimarku ke ni bezonas salon longo pli , pro tio ni daŭre bezonas nula terminator al la fino de nia salo. Tiam ni iras por deklari ĉi tabelo, gasto, de amplekso max longo pli , kie maks longo estas hash difinita kiel ok, ekde la maksimuma pasvorton Estas ok signojn longa. Kaj ni tuj uzi ĉi persisti super ĉiuj ebla kordoj kiuj povis validus pasvortojn. Do se la validajn signojn en pasvorton Estis nur, b, kaj c, tiam ni devus persisti super a, b, c, aa, ba, ca, kaj tiel plu, ĝis ni atingos vidi cccccccc - ok c aj jaroj. Kaj se ni ne havus tian malsupren validan pasvorto, tiam ni devas diri ke la ĉifrita kordo ne estis valida por komenci. Do nun, ni atingos ĉi tion dum 1 buklo. Rimarku ke tio signifas ke estas malfinia ciklo. Rimarku ne estas rompo komunikaĵo ene de ĉi senfina iteracio. Ekzistas nur reveni deklaroj. Do ni neniam vere atendas por eliri la banton. Ni nur atendas por eliri la programon. Mi aldonis tiun print deklaro al la supro de tiu buklo al nur elprinti kio nia aktuala konjekton en kion la pasvorto estas. Nun, kio ĉi buklo faras? Ĝi estas looping super ĉiuj ebla kordoj kiu povus esti valida pasvortojn. La unua afero, ni tuj faros estas prenu nian aktualan konjekton pro kio la pasvorto estas. Ni prenos la salo kiu ni kaptis el la kodita ĉeno, kaj ni estas tuj ĉifri la konjekton. Ĉi tio donos al ni ĉifrita konjekto, kiun ni iras kompare kontraŭ la kodita ĉeno kiu la uzanto eniris en la komandlinio. Se ili estas la sama, en kiu kazo kordo komparebla revenos nulo, se ili estas la sama, tiam diveni estis la pasvorton kiu generis la ĉifrita kordo, en kiu kazo oni povas presi ke kiel nia pasvorton kaj reveno. Sed se ili ne estis la sama, kiu signifas nia diveno malĝusta. Kaj ni volas persisti por la venonta valida konjekton. Do, tio estas kion tio dum buklo provas fari. Ĝi okazas ankaŭ persisti en nia konjekton al la sekvanta valida konjekton. Rimarku, ke kiam ni diras ke aparta karaktero de nia diveno havas atingis la max simbolo, kiu ĉi tien estas hash difinita kiel supersigno, ekde tio estas la plej granda ASCII valoro karaktero ke uzanto povas eniri en la klavaro, kiam la karaktero atingas la maks simbolon, tiam ni volas sendi ĝin al la minimuma simbolo, kiu estas spaco, denove la plej malalta ASCII valoro simbolo kiun uzanto povas eniri ĉe la klavaro. Do ni tuj starigu ke al la minimuma simbolo. Kaj tiam ni tuj iru al la venonta signo. Do kiel estas niaj konjektoj tuj persisti? Nu, se la validaj signoj estas a, b, kaj c, tiam se ni komencis kun a, ĝi devos persisti al b, tio instruos vin persisti al c. c estas nia maks simbolo, tial ni starigis c reen al, la minimuma simbolo. Kaj tiam ni devos persisti indekso al la sekvanta signo. Do, se la originala diveno c, la sekvanta karaktero tuj estos la nula terminator. Cxi tie, rimarki ke se la karaktero ke ni nun volas pliigo estis la nula terminator, tiam ni tuj starigu gxin al la minimuma simbolo. Do se la diveno c, tiam nia novan konjekton tuj estos aa. Kaj se nia originala diveno CCCC, tiam nia nova konjekton tuj estos aaaaa. Do kiam ajn ni atingas la maksimuman kordo de donita longo, tiam ni estas tuj apliki al la minimuma kordo de la venonta longitudo, kiu estos nur estu ĉiuj karakteroj de la minimuma simbolo. Nun, kio ĉi ĉekon faras ĉi tie? Nu, se index kopiis de la oka karakteron al la naŭ karaktero - do ni aldonos ok c estas kiel nia antaŭa diveni - tiam indekso tuj enfokusigi la lasta nula terminator de nia diveno tabelo, kiu ne intencis efektive esti uzata en nia pasvorton. Do, se ni enfokusigas sur tiu lasta nula Terminator, tiam ni ne trovis pasvorton kiu estas valida uzante nur ok karakterojn, kiu signifas ne ekzistas valida pasvorton kiu encrypts al la donita linio. Kaj ni devas presi, kiu jene Ni ne povis trovi validan pasvorto, kaj reveni. Do tio dum buklo tuj persisti super ĉiuj ebla kordoj. Se ĝi trovas neniun kiu encrypts al la atendis ĉifrita ĉenon, tio instruos vin revenu ke pasvorton. Kaj ĝi ne trovas ion, tiam ĝi revenos, presi ke ne povis trovi nenion. Nun, rimarki ke ripetanta super ĉiuj ebla kordoj estas probable tuj preni momenton. Ni efektive vidi kiel longa kiu portas. Ni faru fendo. Nu, oops - diras nedefinita referenci al kripto. Do memoru, por la p aroj spec kaj Ankaŭ la viro paĝo por kripto, ke ni bezonas ligi en kripto. Nun, la defaŭlta faru komandon Ne scias ke vi volas uzi tiun funkcion. Do ni kopias ĉi kliento komando kaj simple aldonu al la fino pri tio, ligante kripto. Nun, ĝi kompilas. Do ni kuros fendo sur donita ĉifrita kordo - tiel Cezaro. Por ke estis sufiĉe rapide. Rimarku ke ĉi finiĝis je 13. Nu, Cezaro ĉifrita pasvorto hazarde estas 13. Do ni provu alian pasvorton. Ni prenu Hirschhorn estas ĉifrita pasvorto kaj provi krakas tio. Do rimarki ni jam atingis tri signojn. Kaj ni ripetanta super ĉiuj ebla tri-karaktero ŝnuroj. Tio signifas ke ni jam fini ripetanta super ĉiuj ebla kaj du karaktero ŝnuroj. Nun, ĝi aspektas kiel ĉi tio tuj preni momenton antaŭ ol ni atingos la kvar karaktero ŝnuroj. Eble kelkaj minutoj. Ĝi ne postrestis kelkaj minutoj. Ni estas sur la kvar-karaktero ŝnuroj. Sed nun, ni bezonas ankaŭ persisti super ĉiuj eble kvar karaktero ŝnuroj, kiuj kiuj povus fari eble 10 minutoj. Kaj poste kiam ni atingos kvin karaktero kordoj, ni bezonas ankaŭ persisti super ĉiuj de tiuj, kiuj povus prenu paron horoj. Kaj ni bezonas ankaŭ persisti super ĉiuj ebla ses-karaktero ŝnuroj, kiuj povus preni kelkajn tagojn kaj tiel plu. Do ĝi povus preni potenciale tre longa tempon por persisti super ĉiuj ebla ok-karaktero kaj malpli da kordoj. Do rimarki ke tiu ne estas nepre tre kompetenta algoritmo por trovi pasvorto. Vi povus pensi, ke tie estas pli bonaj manieroj. Ekzemple, la pasvorton ZYX! 32ab Probable ne estas tre komuna pasvorton, dum la pasvorton 12345 estas verŝajne multe pli komuna. Do unu vojo klopodante trovi pasvorton pli rapide estas simple rigardu ĉe pasvortoj, kiu estas pli komuna. Do ekzemple, ni povas provi legi vortojn el vortaro kaj provi ĉiujn tiuj vortoj kiel nia pasvorton divenas. Nun, eble pasvorton ne estas tiel simpla. Eble la uzanto estis tiel ruza kaj provi appending numero al la fino de vorto. Do eble ilia pasvorto estis password1. Do vi povas provi ripetanta super ĉiuj vortoj en la vortaro per unu aldonita ĉe la fino de ĝi. Kaj tiam eble post fari tion, vi instruos vin postglui al du al la fino de ĝi. Aŭ eble la uzanto provas esti eĉ pli lerta, kaj ili volas lian pasvorto estu "hacker", sed ili estas tuj anstataŭi ĉiujn petskribojn de e la kun triope. Tiel vi povus fari tion ankaŭ. Persisti super ĉiuj vortoj en la vortaro sed anstataŭi karakteroj kiuj aspektas kiel numeroj kun tiuj numeroj. Do tiu vojo, vi povus kapti eĉ pli pasvortoj, kiu estas sufiĉe komuna. Sed en la fino, la sola maniero vi povas kapti ĉiujn pasvortojn estas malpura devigi persisti super ĉiuj ebla kordoj. Tiel en la fino, vi bezonos ankaŭ persisti super ĉiuj kordoj de unu signo por ok karakteroj, kiu povus preni tre longa tempo, sed vi devas fari. Mia nomo estas Rob Bowden. Kaj jen estas Crack.