ROB 보덴 : 나는 롭 해요, 그리고 의 크래킹하자. 그래서 PSET 사양에서 기억하는 우리는을 사용할 필요가 될거야 토굴 기능. 맨 페이지를 위해, 우리는 두 개의 해시 _xopensource 정의합니다. 이유에 대해 걱정하지 마십시오 우리는 그것을 할 필요가있다. 또한 해시 unistd.h 파일 있습니다. 그래서 일단 그 방법을 밖으로,하자 실제 프로그램을 얻을. 우리가해야 할 첫 번째 일은 있는지 확인합니다 사용자가 유효한 암호화를 입력 명령 줄에서 암호를 입력합니다. 프로그램이 예상되는 기억 점 슬래시 균열처럼 실행하고 수 다음 암호화 된 문자열입니다. 그래서 여기에 우리가 있는지 확인하는 검사입니다 그 두 ARGC 우리가하려는 경우 프로그램을 계속합니다. ARGC 두없는 경우, 그 중 하나가 의미 사용자가 암호화를 입력하지 않았습니다 명령 줄에서 암호를하거나, 단지 암호화 된 이상 입력 명령 줄에서 암호하는 경우 우리와 어떻게 해야할지 모르겠어요 명령 줄 인수. ARGC 두 있었다면 그래서, 우리는 계속할 수 있습니다. 그리고 여기, 우리는 선언 할거야 변수 암호화. 그건 그냥 별칭 원에게로가는거야 argv1는 그래서이 전역 이 프로그램은, 우리는 그것을 argv1 호출 할 필요가 없습니다 그 어떤 당신이 생각해야 이 실제로 무엇을 의미하는지에 대한. 그래서 결국, 우리는 그 유효성을 검사하려면 암호화 된 암호 사용자 입력 실제로 수 있었다 암호화 된 암호를 입력합니다. 토굴의 매뉴얼 페이지 당 암호화 된 암호는 13이어야합니다 긴 문자입니다. 여기까지, 우리는 해시 정의 된 것을 알 수 13로 길이를 암호화합니다. 그래서 우리는 단지 확신이 만들고있어 암호화의 문자열 길이 암호는 13이다. 그렇지 않을 경우, 우리는 원하는 프로그램을 종료합니다. 그래서 일단 그것은 우리가 길을 수 밖 이제 실제로 찾으려고 무엇을 암호화를 준 비밀 비밀번호를했다. 여기, 우리는 소금을 잡고 싶어 암호화 된 암호에서. , 맨 페이지 당 기억하십시오 암호화의 처음 두 문자 문자열, 여기에 좋아 - 50ZPJ 등 - 처음 두 문자주고 우리 사용 된 소금 토굴 기능을합니다. 그리고 여기, 우리는 소금 하 것을 참조하십시오. 그래서 우리는 처음 두를 복사하려면 자, 소금의 길이는 해시되고 두 가지로 정의. 우리는 처음 두 문자를 복사해야 이 배열에, 소금. 우리는 플러스 소금 길이를 필요로하는 것을 알 수 우리는 여전히 널을해야하므로 하나, 우리 소금의 끝에 터미네이터. 그런 다음이 배열을 선언 할거야 크기 최대 길이의 손님 플러스 최대 길이가 정의 된 해시 하나, 8 개 이후 최대 암호 8 자입니다. 그리고 우리는 반복이 사용하는거야 가능한 모든 문자열을 통해 그 수 유효한 비밀번호합니다. 그렇다면 암호 유효한 문자 그럼 그냥 A, B 및 C 있었다 우리는 이상 B, C를 반복 할 AA, BA, CA, 등등,까지 우리는 CCCCCCCC 보게 - 여덟 C의. 그리고 우리는 유효한 아래하지 않은 경우 암호, 우리는 말할 필요가 암호화 된 문자열은 없었다 로 시작하는 유효한. 그래서 지금, 우리는 1 루프를하는 동안이 도달합니다. 그건 즉, 알 무한 루프. 더 break 문이없는주의 이 무한 루프 내부. 만 문이 반환됩니다. 그래서 우리는 실제로 기대하지 않는다 루프를 종료합니다. 우리는 프로그램을 종료 할 것으로 예상된다. 나는이 print 문을 추가했습니다 이 루프의 상단은 인쇄하기 에서 어떻게 현재의 생각 무슨 암호입니다. 자,이 루프는 무엇을하고 있습니까? 그것은 가능한 모든 문자열을 반복하는 것 그 유효한 암호가 될 수 있습니다. 우리가 할 수있는 일은 우선이다 현재의 생각을 무엇을 위해 비밀번호입니다. 우리는 우리가에서 잡고있는 소금 할게요 암호화 된 문자열, 우리는거야 추측을 암호화하는 것. 이것은 우리에게 암호화 된 추측을 줄 것이다 우리는 비교할려고하는 암호화 된 문자열을 사용자 명령 줄에 입력. 그들은 동일한 경우이 경우에 비교 문자열, 경우 0을 반환합니다 그들은 같은거야, 그이었다고 생각한다 암호화 된 생성 된 암호 문자열, 우리는 인쇄 할 수있는 경우 우리의 암호를 반환으로합니다. 하지만 그들은 동일한되지 않은 경우 해당 우리의 추측이 올바르지 의미합니다. 그리고 우리는을 반복하려면 다음 유효 추측. 그래서이 이러는 동안 루프가 수행하려고합니다. 그것은 우리의 생각을 반복하는거야 다음 유효한 추측합니다. 우리가 말할 때 통지하는 우리의 추측에 특정 문자가 여기까지 최대 기호를 도달 해시 이후 물결표로 정의됩니다 그 가장 큰 ASCII 값을 문자의 사용자에 입력 할 수있는 키보드, 때 문자가 도달 최대 기호는, 우리는 보내려면 그것은 최소한의 기호에 백업하는 다시 낮은 ASCII 공간 값 기호 사용자가 할 수있는 키보드로 입력합니다. 그래서 우리가를 설정하는거야 최소 심볼. 그리고 우리가 갈거야 다음 문자로합니다. 어떻게 우리의 추측은 반복하는거야? 음, 유효한 문자는 A, B 경우 C는, 우리는,로 시작하는 경우 그것은 B를 반복합니다, 그것은거야 C를 반복. C는 우리의 최대 상징이다, 그래서 우리는 설정합니다 다시 C, 최소 기호. 그리고 우리는 색인을 반복합니다 다음 문자. 원래의 추측은 C, 그 다음이었다 그래서 만약 문자는 널 (NULL)이 될 것입니다 터미네이터. 여기 아래, 통지하는 경우 문자 우리가 지금 할 증가는 널 (NULL) 종료했다 그 후에 우리는 그것을 설정하는거야 최소 기호입니다. 추측 후, C이었다 그래서 만약 우리 새로운 생각은 AA 될 것입니다. 그리고 우리의 원래의 추측 인 경우 다음 CCCC, 우리의 새로운 생각 AAAAA 될 것입니다. 그래서 때마다 우리는 최대 문자열에 도달 주어진 길이, 우리는거야 최소 문자열로 구현하는 것 다음 길이, 어떤 것 그냥 문자 수 최소 기호. 자,이 검사는 여기에서 무엇을하고 있습니까? 음, 만약 인덱스 여덟 번째에서 이동 아홉 문자 문자 - 그래서 우리는 여덟 C의로 추가 생각 우리의 이전 - 그 인덱스에 초점을 것입니다 우리의 추측 마지막 널 (NULL) 종료 사실을 의미하지 않습니다 배열 우리의 암호에 사용할 수. 우리는 그 마지막 널 (null)에 집중되는 경우에 터미네이터, 우리는 발견되지 않은 유효한 그냥 팔을 사용하여 암호 가 어떤 의미 자 암호화 올바른 암호 주어진 문자열. 그리고 우리는 말하는 것을 인쇄 할 우리는 유효한을 찾을 수 없습니다 암호 및 반환. 그래서 while 루프는 반복하는 것입니다 가능한 모든 문자열에. 찾은 경우에 어떤를 암호화하는 예상 암호화 된 문자열, 그것은거야 해당 암호를 반환합니다. 그리고 그 다음, 아무것도 찾을 수 없습니다 그것은 인쇄, 반환 해 아무것도 찾을 수 없습니다. 이제, 통지 된 모든 반복 가능한 문자열은 아마도가는 시간이 좀 걸릴. 하자 실제로 확인하는 방법 긴이 걸립니다. 의 균열을하자. 음, 죄송합니다 - 그것은 정의되지 않은 말한다 토굴을 참조 할 수 있습니다. p는 명세를 설정하고를 위해, 그래서 기억 토굴에도 man 페이지가 우리 토굴에 연결해야합니다. 이제 기본 명령을 모르는 당신 이 기능을 사용하려면. 그렇게하자이 클라이언트 명령을 복사 그냥 말에 추가 그것의, 연결 토굴. 지금, 그것은 컴파일합니다. 그래서하자가 주어진에 균열을 실행 암호화 된 문자열 - 황제의 너무. 그래서 꽤 빨랐다. 이 13 일 끝난 알 수 있습니다. 물론, 시저의 암호화 된 패스워드 13 수 발생합니다. 그럼 다른 암호를 입력 할 수 있습니다. 의는 Hirschhorn의 암호​​화를 보자 암호 부수기보십시오. 우리가 이미 도달했습니다 그래서 통지 세 개의 문자. 우리는 가능한 모든 반복하고 세 문자로 된 문자열. 그것은 우리가 이미 완료 한 것을 의미합니다 가능한 모든 하나를 통해 반복하고 두 개의 문자열. 이 거 야처럼 지금, 그것은 보인다 우리가 도달하기 전에 시간이 걸릴 네 문자열. 그것은 몇 분 정도 걸릴 수 있습니다. 그것은 몇 분 걸리지 않았다. 우리는 네 문자열에 있어요. 하지만 지금, 우리는 모두를 반복 할 필요가 가능한 네 문자열, 어떤 그것은 아마도 10 분 정도 걸릴 수 있습니다. 그리고, 우리는 다섯 개의 문자를 도달하면 문자열, 우리 모두 반복 할 필요가 그 중, 어느 수도 몇 시간이 걸릴. 그리고 우리는 모든 가능한 반복 할 필요가 여섯 문자열, 어떤 그래서 며칠 걸릴 수 있습니다. 그래서 그것은 매우 긴 잠재적 걸릴 수 모든 가능한 반복하는 시간 8 자와 적은 문자열. 그래서 이것은 필요는 없습니다 것을 알 수 찾는 매우 효율적인 알고리즘 암호를 입력합니다. 당신이 생각하는 거기 더 나은 방법이 있습니다. 예를 들어, 암호 ZYX! 32ab 아마 매우 일반적인 암호가 아니다 12345 암호는 반면, 아마 더 많은 일반. 암호를 찾기 위해 노력하므로 하나의 방법 더 빨리보고있는 것만으로있다 보다 일반적인 암호에. 그래서 예를 들어, 우리는 단어를 읽으려고 시도 할 수 있습니다 사전에서와 모든 시도 우리의 암호를 추측으로 그 단어. 지금, 어쩌면 비밀번호 그렇게 간단하지 않습니다. 아마 사용자는 다소 영리 과 숫자를 추가하십시오 단어의 끝. 어쩌면 자신의 암호가 password1했다. 그래서 당신은 모든 단어를 통해 반복 시도 할 수 있습니다 한 사전 그것의 끝에 추가. 그리고 아마 그 작업을 수행 한 후, 당신은거야 그것의 끝에 두 가지를 추가합니다. 아니면 사용자도있을하려고합니다 더 영리한, 그들은 원하는 자신의 암호는 "해커"할 수 있지만, 그들은있어 전자의 모든 인스턴스를 대체하는 것 열로 함께. 그래서 당신은이 작업을 수행 할 수 있습니다. 사전의 모든 단어를 반복 하지만 문자를 바꿀 그 숫자와 숫자처럼 보입니다. 그런 식으로, 당신은 더 잡을 수 있습니다 아주 일반적인 암호. 하지만 결국 유일한 방법은 당신이 할 수있는 모든 암호를 캡처는 짐승에게 있습니다 모든 반복 강제 가능한 문자열. 그래서 결국, 당신은 반복해야합니까 한 문자의 모든 문자열을 통해 걸릴 수 있습니다 8 자, 아주 긴 시간,하지만 당신은 그것을 할 필요가있다. 내 이름은 롭 보덴이다. 그리고이 균열이다.