Rob BOWDEN: Ako Rob, at sabihin makapag-crack. Kaya tandaan mula sa spec na pset kami ay pagpunta sa ay nangangailangan na gamitin ang silid sa ilalim ng lupa function. Para sa mga pahina ng tao, mayroon kaming dalawang hash tukuyin _xopensource. Huwag mag-alala tungkol sa kung bakit kailangan namin upang gawin iyon. At din hash isama unistd.h. Kaya sa sandaling iyon sa labas ng paraan, sabihin makapunta sa aktwal na programa. Unang bagay na kailangan naming gawin ay ang tiyakin ipinasok ng gumagamit ang isang wastong naka-encrypt password sa command line. Tandaan na ang programa ay dapat na tumakbo tulad ng dot slash crack, at pagkatapos ay naka-encrypt na string. Kaya dito kami pagsuri upang matiyak na argc sa dalawa kung gusto naming magpatuloy sa programa. Kung argc ay hindi dalawa, na nangangahulugan na alinman sa ang gumagamit ay hindi ipasok ang isang naka-encrypt password sa command line, o sila ipinasok higit pa sa mga naka-encrypt password sa command line, kung saan kaso hindi namin alam kung ano ang gagawin sa mga linya ng command argumento. Kaya kung argc noon ay dalawang, maaari naming magpatuloy. At dito, kami ay pagpunta sa idedeklara isang variable na naka-encrypt. Na lamang ang pagpunta sa alias ang orihinal argv1 kaya na ito sa buong programa, hindi namin kailangang tumawag ito argv1, na pagkatapos ay mayroon kang mag-isip tungkol sa kung ano ang aktwal na nilalayong. Kaya sa wakas, gusto naming patunayan na ang naka-encrypt na password ng gumagamit naipasok sana talaga naging isang naka-encrypt na password. Bawat tao ang pahina ng mga silid sa ilalim ng lupa, ang naka-encrypt na password ay dapat na 13 character ang haba. Hanggang dito, napansin namin na tinukoy ng hash i-encrypt ang haba bilang 13. Kaya lang kami sa pagtiyak na ang string haba ng naka-encrypt password ay 13. At kung hindi, gusto namin upang lumabas mula sa programa. Kaya sa sandaling iyon sa labas ng paraan, maaari naming ngayon talagang subukan upang mahanap kung ano ang password na ibinigay sa naka-encrypt ay password. Dito, nais naming grab ang asin mula sa naka-encrypt na password. Tandaan, ang bawat pahina ng tao, na ang unang dalawang mga character ng isang naka-encrypt string, i dito - 50ZPJ at iba pa - ang unang dalawang mga character bigyan amin ang asin na ginamit sa silid sa ilalim ng lupa function. At dito, makikita natin na ang asin ay ha. Kaya gusto namin upang kopyahin ang unang dalawang character, asin haba pagiging hash tinukoy bilang dalawang. Mayroon kaming upang kopyahin ang unang dalawang mga character ito sa array, asin. Pansinin na kailangan namin ng asin haba plus isa, dahil pa rin namin kailangan ang isang null Terminator sa dulo ng aming mga asin. Pagkatapos kami ay pagpunta upang ipahayag ang array, guest, laki ng max na haba plus isa, kung saan ang max na haba ay tinukoy ng hash bilang walo, dahil ang maximum password ay walong mga character ang haba. At kami ay pagpunta sa gamitin ito upang umulit sa ibabaw ng lahat ng posibleng mga string na maaari maging wastong mga password. Kaya kung ang wastong character sa isang password ay lang a, b, at c, pagkatapos ay Gusto naming umulit sa paglipas ng a, b, c, aa, BA, ca, at iba pa, hanggang sa makuha namin upang makita cccccccc - walong ni c. At kung kami ay hindi pababa ng wastong password, pagkatapos ay kailangan naming sabihin na ang naka-encrypt na string ay hindi wastong upang magsimula sa. Kaya ngayon, maabot namin ito habang 1 loop. Pansinin na nangangahulugan na ito isang walang-katapusang loop. Pansinin walang mga break na pahayag sa loob ng walang hangganang ito loop. Mayroon lamang bumalik pahayag. Kaya hindi namin talaga inaasahan upang lumabas mula sa loop. Lamang kami asahan upang lumabas mula sa programa. Idinagdag ko na ang naka-print na pahayag sa tuktok ng loop na ito upang i-print lamang out kung ano ang aming kasalukuyang mga hula sa ano ang password ay. Ngayon, kung ano ang loop ito ginagawa? Ito ay looping sa paglipas ng lahat ng posibleng mga string maaaring hindi wastong mga password. Ang unang bagay na kami ay pagpunta sa gawin ay tumagal ng aming kasalukuyang hula para sa kung ano ang password ay. Kukunin namin ang asin na namin grabbed mula sa ang naka-encrypt na string, at kami ay pagpunta upang i-encrypt ang hula. Ito ay magbibigay sa amin ng isang naka-encrypt na hula, na kung saan kami ay pagpunta sa ihambing laban sa ang naka-encrypt na string ng user inilagay sa linya ng command. Kung ang mga ito ang parehong, kung saan string maihahambing ay magbabalik zero, kung ang mga ito ay ang parehong, pagkatapos ay hulaan ang password na bumuo ng naka-encrypt string, kung saan maaari naming i-print na bilang aming mga password at return. Ngunit kung sila ay hindi ang parehong, na Nangangahulugan ang aming hula ay hindi tama. At gusto namin upang umulit sa sa susunod wastong hula. Kaya iyon ang kung ano ito habang loop ay sinusubukang gawin. Ito ay pagpunta sa umulit ang aming hula sa susunod wastong hula. Pansinin na kapag sinabi namin na ang isang partikular na character sa aming mga hula ay Naabot mo na ang max na simbolo, na hanggang dito hash ay tinukoy bilang isang tilda, dahil iyon ang pinakamalaking halaga ASCII na character na ang isang user ay maaaring ipasok sa keyboard, kapag ang mga character na umabot sa max simbolo, pagkatapos ay nais naming ipadala ang i-back ito sa minimum na simbolo, na ay isang puwang, muli ang pinakamababang ASCII halaga simbolo na ang isang gumagamit ay maaari ipasok sa keyboard. Kaya kami ay pagpunta sa set na sa minimum na simbolo. At pagkatapos ay kami ay pagpunta sa pumunta sa susunod na character. Kaya kung paano ang aming mga guesses pagpunta sa umulit? Well, kung ang wastong mga character ay a, b, at c, pagkatapos kung namin magsimula sa isang, Makikita ito upang umulit b, bibigyan ito umulit sa c. c ay ang aming max simbolo, kaya magtatakda kami c pabalik sa, ang minimum na simbolo. At pagkatapos ay gagamitin namin umulit index sa susunod na character. Kaya kung ang orihinal na hula ay c, ang susunod na na karakter ay pagpunta sa maging null Terminator. Down dito, mapapansin na kung ang character na namin ngayon ay nais upang paglakas ay ang null Terminator, pagkatapos kami ay pagpunta upang i-set ito sa minimum na simbolo. Kaya kung ang hula ay c, pagkatapos ay ang aming bagong hula ay magiging ee. At kung ang aming orihinal na hula ay cccc, pagkatapos ay ang aming bagong hula ay magiging aaaaa. Kaya sa tuwing namin maabot ang maximum na string ng isang naibigay na haba, pagkatapos kami ay pagpunta sa ipatupad sa pinakamaliit na string ng susunod na haba, na kalooban lamang maging ang lahat ng mga character ang minimum na simbolo. Ngayon, kung ano ang tseke ito ginagawa dito? Well, kung ang index ay inilipat mula sa pangwalo na character sa siyam na character - kaya naming magdagdag ng walong c bilang ang aming nakaraang hulaan - pagkatapos ay i-index ay pagpunta upang tumutok sa mga huling null Terminator ng aming mga hula array, na kung saan ay hindi ginawa upang aktwal magamit sa aming password. Kaya kung kami ay nakatuon sa na huling null Terminator, pagkatapos ay hindi pa namin nakitang isang password na wastong gamit lamang walong character, na nangangahulugan na walang wastong password na ine-encrypt sa naibigay na string. At kami ay may upang i-print na, na sinasabi Hindi kami makahanap ng wastong password, at tubo. Kaya ito habang loop ay pagpunta sa umulit sa ibabaw ng lahat ng posibleng mga string. Kung nahahanap nito ang anuman na ine-encrypt sa Inaasahan ang naka-encrypt na string, bibigyan ito bumalik na password. At hindi ito mahanap ang anumang bagay, at pagkatapos ay ito ay bumalik, pag-print na ito Hindi nagawang upang mahanap ang anumang bagay. Ngayon, mapapansin na ang iterating sa ibabaw ng lahat posible string ay marahil pagpunta sa magtagal. Natin talaga makita kung paano matagal na tumatagal. Sabihin gumawa crack. Well, oops - sinasabi nito na hindi naipalilawanag isangguni sa silid sa ilalim ng lupa. Kaya tandaan, para p ang nagtatakda spec at din ang mga tao na pahina para sa silid sa ilalim ng lupa na namin kailangan na mag-link sa silid sa ilalim ng lupa. Ngayon, ang default na gumawa ng utos Hindi alam mo na nais na gumamit na function. Kaya sabihin kopyahin ito client utos at idagdag lamang sa hanggang sa dulo ng mga ito, pag-uugnay silid sa ilalim ng lupa. Ngayon, ito compiles. Kaya natin patakbuhin crack sa isang naibigay na naka-encrypt na string - kaya ni Caesar. Kaya na noon ay medyo mabilis. Pansinin na ito natapos sa 13. Well, Caesar ng naka-encrypt na password Nagkataong 13. So sabihin subukan ang ibang password. Magpahinga Hirschhorn ng naka-encrypt password at subukang mag-crack na. Kaya mapapansin na namin naabot tatlong character. At kami ay iterating sa paglipas ng lahat ng mga posibleng tatlong-character na string. Nangangahulugan iyon na namin tapusin iterating sa paglipas ng lahat ng mga posibleng isa at dalawang character na string. Ngayon, mukhang ito ay pagpunta sa matagalan bago maabot namin ang apat na-character na string. Maaaring tumagal ng ilang minuto. Hindi nito tumagal ng ilang minuto. Ikinalulungkot namin sa apat na-character na string. Ngunit ngayon, kailangan namin upang umulit sa ibabaw ng lahat posible apat na-character na string, na na maaaring tumagal siguro 10 minuto. At pagkatapos ay kapag naabot namin ang limang karakter string, kailangan namin upang umulit sa ibabaw ng lahat ng mga, na kung saan maaari tumagal ng dalawang oras. At kailangan namin upang umulit sa paglipas ng lahat ng mga posibleng anim na-character na string, na Maaaring tumagal ng ilang mga araw at iba pa. Kaya maaari itong tumagal ng isang potensyal na masyadong mahaba oras upang umulit sa paglipas ng lahat ng mga posibleng walong-character at mas kaunting mga string. Kaya mapapansin na ito ay hindi nangangahulugang isang napaka mahusay na algorithm para sa paghahanap ng isang password. Maaari mong isipin na mayroong ay mas mahusay na paraan. Halimbawa, ang password zyx! 32ab marahil ay hindi isang napaka-karaniwang mga password, samantalang ang password 12345 ay marahil ng maraming mas karaniwang. Kaya isang paraan ng sinusubukan upang makahanap ng isang password mas mabilis ay upang tingnan lamang sa mga password na ay mas karaniwan. Kaya halimbawa, maaari naming subukan na basahin ang mga salita mula sa isang diksyunaryo at subukan ang lahat ng mga salitang iyon ng aming guesses password. Ngayon, marahil ng isang password ay hindi na simple. Siguro ang user ay medyo matalino at subukang appending isang numero sa sa dulo ng isang salita. Kaya marahil ang kanilang password ay password1. Kaya maaari mong subukan iterating sa paglipas ng lahat ng mga salita sa diksyunaryo na may isa nakadugtong sa dulo ng ito. At pagkatapos ay marahil pagkatapos ng paggawa na, bibigyan ka ikabit ang isang dalawang sa dulo ng ito. O siguro ang user ay sumusubok na maging kahit na mas matalino, at nais nila ang kanilang password upang maging "Hacker," ngunit ang mga ito ay pagpunta sa palitan ang lahat ng mga pagkakataon ng e ni may threes. Kaya maaari mong gawin ito masyadong. Umulit sa lahat ng mga salita sa diksyunaryo pero palitan ang mga character na hitsura ng mga numero na may mga numero. Kaya sa ganitong paraan, maaari mong abutin kahit na higit pa mga password na ay medyo pangkaraniwan. Ngunit sa katapusan, ang tanging paraan na maaari mong makuha ang lahat ng mga password ay ang taong malupit puwersahin ang umulit sa ibabaw ng lahat posible string. Kaya sa katapusan, mo kailangang umulit sa lahat ng mga string mula sa isang character sa walong mga character, na maaaring tumagal ng masyadong mahaba ang oras, ngunit kailangan mong gawin ito. Ang pangalan ko ay Rob Bowden. At ito ay crack.