2017-05-03 18 views
-1

나는 머리를 꽤 많이 긁어 모으고 해결책을 찾지 못했다. 간단한 4 글자 암호를 해독하기 위해이 코드를 작성했습니다 (아래 코드 참조). 암호가 올바르게 생성되었고 모든 가능성이 A에서 Z까지의 모든 문자 조합으로 테스트되지만 루프가 끝나지 않는다는 것을 알 수 있습니다. 누군가 왜 저에게 말할 수 있습니까?크립트 무한 루프 결코 끝내지 않는 루프

#include <cs50.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <crypt.h> 


int main(int argc, string argv[]) 
{ 
//check number of arguments 
if(argc != 2) 
{ 
    printf("Usage: ./crack hash\n"); 
} 

char str[5]; 
char salt[] = ".."; 
strncpy(salt, argv[1], 2); 
string hash = argv[1]; 
string password = "...."; 
char pass[5]; 


//brute force loop 
for(int i = 65; i < 123; i++) 
{ 
    str[0] = i; 
    for(int j = 65; j < 123; j++) 
    { 
     str[1] = j; 
     for(int k = 65; k < 123; k++) 
     { 
      str[2] = k; 
      for(int l = 65; l < 123; l++) 
      { 
       str[3] = l; 
       str[4] = '\0'; 

       strcpy(pass, str); 

       password = crypt(pass, salt); 
       if (hash == password) 
       { 
        printf("%s\n", password); 
        break; 
       } 

       printf("\r%s", pass); 
       fflush(stdout); 
      } 
     } 
    } 
} 
} 
+2

에서 두 문자열을 비교하려는 때문에

if (hash == password)if(!strcmp(hash,password)) 을해야합니다. 나머지는 계속됩니다. –

+0

모든 조합을 시도한 후에 끝나야하며 끝나지 않아야합니다. 아마도 그 질문은 가난하게 말로 표현되어있을 것입니다. – AlastairG

+0

"문자열"유형이란 무엇입니까? – AlastairG

답변

2

변경하려면 return에서의 break 경우 모든 루프를 종료합니다. 코멘트에 지적

또한 : 당신은 당신 만 4 루프를 중단 C.

+0

완벽하게 작동합니다. 그냥 질문, 왜 해시 == 비밀 번호가 작동하지 않을까요? 여전히 두 문자열을 비교하고 있습니까? string은 strcmp 함수와 만 비교합니까? – Tripduc

+0

@Tripduc'cs50.h'을 만들고'char *'를'string'으로 만들었던 악마가 전혀 도움이되지 않았기 때문입니다. 'hash == password'는 C가 포인터 * (to *)를 가리키는 * content *가 아닌 두 포인터 (즉, 각각 안에있는 주소)를 비교한다는 것입니다. 단순한 단어는 그 헤더 파일에 숨겨진'char *'typedef가 사람들에게 새로운 언어를 야기한 것에 대한 좌절감을 표현할 수 없다. 종료 된 문자열을 비교하는 적절한 방법은'strcmp'와 같은 함수를 통한 동등성을위한 C입니다. – WhozCraig

+0

이 질문 읽기 [here] (http://stackoverflow.com/q/3933614/4532326) – granmirupa