>> 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 자, 아주 긴 시간,하지만 당신은 그것을 할 필요가있다.
>> 내 이름은 롭 보덴이다.
그리고이 균열이다.