2015-03-17 1 views
1

Я пишу программу, которая берет файл с 3 строками зашифрованных паролей и сравнивает их со всеми 4 строчными буквами от aaaa-zzzz. Единственная проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как идти по строкам файла, который я вводил, и как сравнить его с четырьмя буквами в отдельности. Затем он должен распечатать 3 расшифрованных слова из 4 букв, которые коррелируют с паролями из файла. Также, если есть какие-либо типы улучшения кода, пожалуйста, дайте мне знать. Я новичок в этом, поэтому мне нужны ясные объяснения и примеры, если это возможно. Спасибо.Файл ввода/вывода низкого уровня Сравнение строк

РЕДАКТИРОВАТЬ *****

Основная проблема заключается в всей функции и основные. Я не хочу печатать aaaa, aaab, aaac и т. Д. На экране, но я хочу поместить его в массив char, чтобы я мог сравнивать каждый отдельно от каждой строки из файла с помощью crypt. Поэтому мне нужен совет о том, как поместить все комбинации 456976 в массив, сравнить его с каждой строкой кода и распечатать решения на экране.

файл выглядит следующим образом:

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

Мой код выглядит следующим образом:

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

#define BUFFER_SIZE 1024 

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; 
} 

int inc(char *c,char begin, char end){ 
    if(c[0]==0) 
     return 0; 
    if(c[0] == end){ // This make the algorithm to stop at char 'f' 
     c[0]=begin;  // but you can put any other char    
     return inc(c+sizeof(char), begin, end); 
    } 
    c[0]++; 
    return 1; 
} 

char all(int a, int n,char begin, char end){ 
    int i, j; 
    char *c = malloc((n+1)*sizeof(char)); 
    char result[] = ""; 
    for(i = a; i <= n; i++) 
    { 
     for(j=0;j<i;j++) c[j]=begin; 
     c[i]=0; 
     do { 
     int k = sizeof(result); 
     for (int g = 0; g < k -1; g++) 
     { 
      result[g] = c; 
     } 
     } while(inc(c,begin,end)); 
    } 

    free(c); 
} 

int main(int argc, char* argv[]) 
{ 
    char *result; 
    char let[456976]; 
    int f = open("pass.txt", O_RDONLY); 
    if (f < 0) 
     return 0; 
    char buf[1024]; 
    while (my_fgets(buf, sizeof(buf), f)) 
    { 
     let = all(4,4,'a','z'); 
     int i = 0; 
     result = crypt((let[i+1]), buf); 
     int ok = strcmp (result, pass) == 0; 
     return ok ? 0 : 1; 

     all(4, 4, 'a', 'z'); 

    } 
    close(f); 
} 
+0

Почему 'ssize_t г = чтения (RFD, буфер, 1); return r; '? Кажется странным возвращать количество прочитанных вещей. Я бы ожидал 'ssize_t r = read (rfd, buffer, 1); return buffer [0]; 'с некоторой проверкой ошибок. – chux

+0

О, я мог это видеть. Im также имеет проблемы с преобразованием строки кода в символы char *, поэтому я могу использовать его для тестирования в функции криптографии .... @chux – kids

+0

Отредактирован вопрос о новых проблемах – kids

ответ

0

Я думаю, что вам нужно перефразировать вопрос. Возможно, код ниже - это то, что вы хотите. Допустим, у вас есть пароль, и у вас есть файл, который содержит список зашифрованных паролей (или хэш обычно), вы хотите узнать, правильный или неправильный пароль. Вы сравниваете хэш пароля с хэшами в файле. Я не тестировал этот код.

ps, ​​дайте мне знать, если я уйду, я удалю ответ.

void crypt(char* hash, const char* password_test) { 
    //create hash from password, or encrypt it or something? 
} 

int test_password(const char *filename, const char *password){ 
    FILE *f; 
    f = fopen(filename, "r"); 
    if (!f) return 0; 
    char password_hash[256]; 
    crypt(password_hash, password); 

    char hash[256]; 
    char buf[1024]; 
    while (fgets(buf, sizeof(buf), f) != NULL) 
    { 
     crypt(hash, buf); 
     if (strcmp(password_hash, hash) == 0) 
      return 1; 
    } 

    fclose(f); 
    return 0; 
} 

void main() { 
    int result = test_password("test.txt", "password"); 
    if (result == 1) 
     printf("password is good\n"); 
} 

чтения строка за строкой, используя open/read/close

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; 
} 

int main(){ 
    int f = open("test.txt", O_RDONLY); 
    if (f < 0) return 0; 
    char buf[1024]; 
    while (my_fgets(buf, sizeof(buf), f)) 
     printf("%s\n", buf); 
    close(f); 
} 
+0

Это близко, но я в основном ищу, как читать мой файл по строкам с использованием ввода/вывода низкого уровня и как он будет сравнивать его с aaaa, aaab и т. Д. Отдельно от моей всей функции. Имеет ли это смысл? – kids

+0

Примечание: нет необходимости в 256-1, 'fgets (buf, sizeof buf, f)' отлично. Не забывайте справляться с '' \ n'' в 'strcmp()'. – chux

+0

Чтение файла по строкам: http://stackoverflow.com/a/3501681/4603670 @chux, спасибо, исправлено –