package Ġio . github . aj oz . a oc 1 6 Ċ Ċ import Ġjava . security . Message Digest Ċ Ċ /** Ċ Ġ* Ġ--- ĠDay Ġ 5 : ĠHow ĠAbout Ġa ĠNice ĠGame Ġof ĠChe ss ? Ġ--- Ċ Ġ* Ċ Ġ* ĠYou Ġare Ġf aced Ġwith Ġa Ġsecurity Ġdoor Ġdesigned Ġby ĠE aster ĠBun ny Ġengine ers Ġthat Ċ Ġ* Ġseem Ġto Ġhave Ġacquired Ġmost Ġof Ġtheir Ġsecurity Ġknowledge Ġby Ġwatching Ġhack ing Ċ Ġ* Ġmovies . Ċ Ġ* Ċ Ġ* ĠThe Ġeight - character Ġpassword Ġfor Ġthe Ġdoor Ġis Ġgenerated Ġone Ġcharacter Ġat Ġa Ċ Ġ* Ġtime Ġby Ġfinding Ġthe ĠMD 5 Ġhash Ġof Ġsome ĠDoor ĠID Ġ( your Ġpuzzle Ġinput ) Ġand Ġan Ċ Ġ* Ġincreasing Ġinteger Ġindex Ġ( starting Ġwith Ġ 0 ). Ċ Ġ* Ċ Ġ* ĠA Ġhash Ġindicates Ġthe Ġnext Ġcharacter Ġin Ġthe Ġpassword Ġif Ġits Ġhexadecimal Ċ Ġ* Ġrepresentation Ġstarts Ġwith Ġfive Ġzero es . ĠIf Ġit Ġdoes , Ġthe Ġsix th Ġcharacter Ġin Ċ Ġ* Ġthe Ġhash Ġis Ġthe Ġnext Ġcharacter Ġof Ġthe Ġpassword . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġif Ġthe ĠDoor ĠID Ġis Ġabc : Ċ Ġ* Ċ Ġ* ĠThe Ġfirst Ġindex Ġwhich Ġproduces Ġa Ġhash Ġthat Ġstarts Ġwith Ġfive Ġzero es Ġis Ċ Ġ* Ġ 3 2 3 1 9 2 9 , Ġwhich Ġwe Ġfind Ġby Ġhashing Ġabc 3 2 3 1 9 2 9 ; Ġthe Ġsix th Ġcharacter Ġof Ġthe Ċ Ġ* Ġhash , Ġand Ġthus Ġthe Ġfirst Ġcharacter Ġof Ġthe Ġpassword , Ġis Ġ 1 . Ċ Ġ* Ċ Ġ* Ġ 5 0 1 7 3 0 8 Ġproduces Ġthe Ġnext Ġinteresting Ġhash , Ġwhich Ġstarts Ġwith Ġ 0 0 0 0 0 8 f 8 2 ..., Ċ Ġ* Ġso Ġthe Ġsecond Ġcharacter Ġof Ġthe Ġpassword Ġis Ġ 8 . Ċ Ġ* Ċ Ġ* ĠThe Ġthird Ġtime Ġa Ġhash Ġstarts Ġwith Ġfive Ġzero es Ġis Ġfor Ġabc 5 2 7 8 5 6 8 , Ġdiscover ing Ċ Ġ* Ġthe Ġcharacter Ġf . Ċ Ġ* Ċ Ġ* ĠIn Ġthis Ġexample , Ġafter Ġcontinuing Ġthis Ġsearch Ġa Ġtotal Ġof Ġeight Ġtimes , Ċ Ġ* Ġthe Ġpassword Ġis Ġ 1 8 f 4 7 a 3 0 . Ċ Ġ* Ċ Ġ* ĠGiven Ġthe Ġactual ĠDoor ĠID , Ġwhat Ġis Ġthe Ġpassword ? Ċ Ġ* Ċ Ġ* ĠYour Ġpuzzle Ġinput Ġis Ġw tn h xy mk . Ċ Ġ*/ Ċ Ċ fun ĠString . to MD 5 () Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠ Ġ. digest ( toByteArray ()) ĊĠĠĠĠĠĠĠ Ġ. join ToString ("") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% 0 2 x ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ fun Ġget Part 1 MD 5 Hash Password ( door ID : ĠString ) Ġ= ĊĠĠĠ Ġgenerate Sequence ( 0 ) Ġ{ Ġit Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ"$ door ID $ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to MD 5 () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith (" 0 0 0 0 0 ", Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġprintln ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ 5 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") Ċ Ċ /** Ċ Ġ* Ġ--- ĠPart ĠTwo Ġ--- Ċ Ġ* Ċ Ġ* ĠAs Ġthe Ġdoor Ġslides Ġopen , Ġyou Ġare Ġpresented Ġwith Ġa Ġsecond Ġdoor Ġthat Ġuses Ġa Ċ Ġ* Ġslightly Ġmore Ġinspired Ġsecurity Ġmechanism . ĠClear ly Ġun imp ressed Ġby Ġthe Ġlast Ċ Ġ* Ġversion Ġ( in Ġwhat Ġmovie Ġis Ġthe Ġpassword Ġdecrypted Ġin Ġorder ?! ), Ġthe ĠE aster Ċ Ġ* ĠBun ny Ġengine ers Ġhave Ġworked Ġout Ġa Ġbetter Ġsolution . Ċ Ġ* Ċ Ġ* ĠInstead Ġof Ġsimply Ġfilling Ġin Ġthe Ġpassword Ġfrom Ġleft Ġto Ġright , Ġthe Ġhash Ġnow Ċ Ġ* Ġalso Ġindicates Ġthe Ġposition Ġwithin Ġthe Ġpassword Ġto Ġfill . ĠYou Ġstill Ġlook Ġfor Ċ Ġ* Ġhashes Ġthat Ġbegin Ġwith Ġfive Ġzero es ; Ġhowever , Ġnow , Ġthe Ġsix th Ġcharacter Ċ Ġ* Ġrepresents Ġthe Ġposition Ġ( 0 - 7 ), Ġand Ġthe Ġse vent h Ġcharacter Ġis Ġthe Ġcharacter Ċ Ġ* Ġto Ġput Ġin Ġthat Ġposition . Ċ Ġ* Ċ Ġ* ĠA Ġhash Ġresult Ġof Ġ 0 0 0 0 0 1 f Ġmeans Ġthat Ġf Ġis Ġthe Ġsecond Ġcharacter Ġin Ġthe Ċ Ġ* Ġpassword . ĠUse Ġonly Ġthe Ġfirst Ġresult Ġfor Ġeach Ġposition , Ġand Ġignore Ġinvalid Ċ Ġ* Ġpositions . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġif Ġthe ĠDoor ĠID Ġis Ġabc : Ċ Ġ* Ċ Ġ* ĠThe Ġfirst Ġinteresting Ġhash Ġis Ġfrom Ġabc 3 2 3 1 9 2 9 , Ġwhich Ġproduces Ġ 0 0 0 0 0 1 5 ... ; Ċ Ġ* Ġso , Ġ 5 Ġgoes Ġin Ġposition Ġ 1 : Ġ_ 5 ____ __. Ċ Ġ* Ċ Ġ* ĠIn Ġthe Ġprevious Ġmethod , Ġ 5 0 1 7 3 0 8 Ġproduced Ġan Ġinteresting Ġhash ; Ġhowever , Ċ Ġ* Ġit Ġis Ġignored , Ġbecause Ġit Ġspecifies Ġan Ġinvalid Ġposition Ġ( 8 ). ĠThe Ġsecond Ċ Ġ* Ġinteresting Ġhash Ġis Ġat Ġindex Ġ 5 3 5 7 5 2 5 , Ġwhich Ġproduces Ġ 0 0 0 0 0 4 e ... ; Ċ Ġ* Ġso , Ġe Ġgoes Ġin Ġposition Ġ 4 : Ġ_ 5 __ e __ _. Ċ Ġ* Ċ Ġ* ĠYou Ġalmost Ġcho ke Ġon Ġyour Ġpop corn Ġas Ġthe Ġfinal Ġcharacter Ġfalls Ġinto Ġplace , Ċ Ġ* Ġproducing Ġthe Ġpassword Ġ 0 5 ace 8 e 3 . Ċ Ġ* Ċ Ġ* ĠGiven Ġthe Ġactual ĠDoor ĠID Ġand Ġthis Ġnew Ġmethod , Ġwhat Ġis Ġthe Ġpassword ? ĠBe Ġextra Ċ Ġ* Ġpro ud Ġof Ġyour Ġsolution Ġif Ġit Ġuses Ġa Ġcin ematic Ġ" decrypt ing " Ġanimation . Ċ Ġ* Ċ Ġ* ĠYour Ġpuzzle Ġinput Ġis Ġstill Ġw tn h xy mk . Ċ Ġ*/ Ċ Ċ fun ĠString . replace ( position : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar : ĠChar ): ĠString Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġthis . to Mutable List () ĊĠĠĠ Ġlist [ position ] Ġ= Ġchar ĊĠĠĠ Ġreturn Ġlist . join ToString ("") Ċ } Ċ Ċ fun ĠChar . parse ToInt (): ĠInt Ġ= Ġthis . toInt () Ġ- Ġ' 0 '. toInt () Ċ Ċ data Ġclass ĠP wd Char ( val Ġposition : ĠInt , Ġval Ġchar : ĠChar ) Ċ Ċ fun Ġget Part 2 MD 5 Hash Password ( door ID : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Sequence ( 0 ) Ġ{ Ġit Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ"$ door ID $ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to MD 5 () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith (" 0 0 0 0 0 ", Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit [ 5 ] Ġin Ġ Ġ' 0 ' Ġ.. Ġ' 7 ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠP wd Char ( it [ 5 ]. parse ToInt (), Ġit [ 6 ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct By ( Pwd Char :: position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġprintln ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold (" -------- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword , Ġ( position , Ġchar ) Ġ-> Ġpassword . replace ( position , Ġchar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ Ċ // ĠĠĠ Ġprintln ( get Part 1 MD 5 Hash Password (" w tn h xy mk ")) ĊĠĠĠ Ġprintln ( get Part 2 MD 5 Hash Password (" w tn h xy mk ")) Ċ }