2015-06-03 3 views
0

Я создаю программу, которая принимает файл в качестве входных данных. & выводит дешифрованный пароль каждой строки. Файл содержит три строки зашифрованных паролей. Я уверен, что пароли дешифруются до четырех буквенных слов. Учитывая, что я создал char [] букв. У меня возникла проблема с чтением файла по строкам с использованием LOW LEVEL IO и помещением полученного пароля в новый файл. Любой & все советы приветствуются!Ошибка в программе Simple Simple Crypt

Вот мой код до сих пор:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define BUFFER_SIZE 1024 

int main(void) 
{ 

    int f = open("pass.txt", O_RDONLY); 
    if (f < 0) 
     return 0; 
    char buf[1024]; 
    while (my_fgets(buf, sizeof(buf), f)) 
     printf("%s\n", buf); 
    close(f); 
    const char *const pass = "$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B."; 
    char *result; 
    int ok; 
    char guess[] = {'a','a','a','a','\0'}; 
    char ch1=guess[0], ch2=guess[1], ch3=guess[2], ch4=guess[3]; 
    do{ 
     for(ch1; ch1<='z';++ch1) 
     { 
     for(ch2='a';ch2<='z';++ch2) 
     { 
      for(ch3='a';ch3<='z';++ch3) 
      { 
       for(ch4='a';ch4<='z';++ch4) 
       { 
        result = crypt(guess, pass);    
       } 

      } 
     }  
     } 
    }while(strcmp(result, pass) != 0); 
    puts(guess); 
    return 0; 
} 

int my_fgets(char* buf, int len, int f) 
{ 
    for (int i = 0; i < len; i++,buf++) 
    { 
     int count = read(f, buf, 1); 
     if (!count || (buf[0] == '\n')) 
     { 
     buf[0] = 0; 
     return i; 
     } 
    } 
    return 0; 
} 

Текстовый файл:

$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B. 
$1$pkMKIcvE$WQfqzTNmcQr7fqsNq7K2p0 
$1$0lMKIuvE$7mOnlu6RZ/cUFRBidK7PK. 
+0

Вызывает ли эта проблема, что у вас есть какие-либо симптомы *? – WhozCraig

ответ

0

Следующий блок кода, как представляется ошибочным:

while (my_fgets(buf, sizeof(buf), f)) 
    printf("%s\n", buf); 

Что это делает сохранение только последняя строка. Остальные строки считываются и отбрасываются.

Также неясно, как должен быть инициализирован ch1 на каждой итерации цикла do ... while. Вы его как:

for(ch1; ch1<='z';++ch1) 
// ^^^ 

Это не инициализирует ch1. Это выражение без побочных эффектов.

Я предлагаю поместить большую часть логики для дешифрования пароля в свою собственную функцию и вызвать функцию после прочтения каждой строки.

void decryptPassword(char* buf) 
{ 
    printf("%s\n", buf); 
    const char *const pass = "$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B."; 
    char *result; 
    int ok; 
    char guess[] = {'a','a','a','a','\0'}; 
    char ch1=guess[0], ch2=guess[1], ch3=guess[2], ch4=guess[3]; 
    do{ 
     for(ch1; ch1<='z';++ch1) 
     { 
     for(ch2='a';ch2<='z';++ch2) 
     { 
      for(ch3='a';ch3<='z';++ch3) 
      { 
       for(ch4='a';ch4<='z';++ch4) 
       { 
        result = crypt(guess, pass);    
       } 
      } 
     }  
     } 
    }while(strcmp(result, pass) != 0); 
    puts(guess); 
} 

int main(void) 
{ 
    int f = open("soc.in", O_RDONLY); 
    if (f < 0) 
     return 0; 
    char buf[1024]; 
    while (my_fgets(buf, sizeof(buf), f)) 
     decryptPassword(buf); 
    close(f); 
    return 0; 
} 
+0

@r sahu Игнорировать постоянный проход char. это было только для целей тестирования. Так я бы сравнил crypt как crypt (угадать, buf) вместо этого? –

+0

Я не в курсе, как использовать 'crypt'. –

+0

Я получаю сообщение об ошибке при вызове my_fgets по какой-либо причине –