Я работал над программой угадывания пароля, и теперь я пытался выяснить, как заставить ее угадывать пароль, который хэшируется. Моя проблема в том, что вывод моего угаданного пароля не похож на хешированный пароль. Мне было интересно, может ли кто-нибудь указать мне правильное направление.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crypt.h>
#include <sys/random.h>
#define BUFFERSIZE 10000
const char saltchars[]="abcdefghikjlmnopqrstuvWxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+@£[]}";
static const int saltcharsSize = sizeof(saltchars) -1;
int counter = 100;
char saltCopy[13];
char passwordCopy[22];
Я инициализирую алфавит и некоторые глобальные переменные для функций.
void crack(char* string, int index, int maxSize) {
for (int i = 0; i < saltcharsSize; ++i) {
char* guessPassword = crypt(string, saltCopy);
if(strcmp(guessPassword, passwordCopy) == 0) {
printf("Found password: %s\n", string);
}
string[index] = saltchars[i];
if (index == maxSize -1) {
printf("%s\n", guessPassword);
}
else crack(string, index + 1, maxSize);
}
}
void crackRecursive(int maxLength) {
char* buffer = malloc(maxLength + 1);
for (int i = 1; i <= maxLength; ++i) {
memset(buffer, 0, maxLength + 1);
crack(buffer, 0, i);
}
free(buffer);
}
здесь я пытаюсь попросить его зашифровать пароль, используя ту же соль, и сравнить его с копией.
void readDictionary(char* file) {
FILE *filePointer = fopen(file, "r");
char buffer[BUFFERSIZE];
while(fgets(buffer, BUFFERSIZE -1, filePointer) != NULL && counter != 0) {
char* guessPasswordNew = crypt(buffer, saltCopy);
if(strcmp(guessPasswordNew, passwordCopy) == 0){
printf("found password: %s\n", buffer);
}
counter--;
}
fclose(filePointer);
free(filePointer);
printf("\nEnd of program\n");
}
здесь я читаю файл в своем словаре и пытаюсь угадать, является ли оно одним из слов в файле. Та же процедура при угадывании пароля здесь.
int cryptPassword(char* password){
char salt[13]="$1$abcdefgh$";
getrandom(salt+3,8,0);
for(unsigned int i=3;i<11;i++){
salt[i]=saltchars[salt[i] & 0x3f];
}
printf("password is: %s\n", password);
printf("salt is: %s\n", salt);
strcpy(saltCopy, salt);
char* encrypted=crypt(password,salt);
strcpy(passwordCopy, encrypted);
printf("hashed password is: %s\n", encrypted);
free(encrypted);
return 0;
}
это шифрование, оно просто для установки соли, а затем с помощью «crypt» для шифрования пароля с солью.
int main(int argc, char *argv[]) {
cryptPassword("earlybird");
crackRecursive(2);
readDictionary("dictionary.txt");
}
наконец, это основной метод, в котором я устанавливаю пароль «earlybird», который находится в файле dictionary.txt. Я также пробовал с «аА», и это не сработало.
Методы распечатывают все, что я хочу, трещина печатает «aa», а затем «ab» и продолжает перебирать алфавит, который я указала, до конца. Словарь читается правильно. Конечно, это только когда я говорю ему напечатать строку в «crack» и «buffer» в readDictionary.
Я подозреваю, что с солью я совершаю какую-то ошибку, так как похоже, что в хешированном пароле есть соль впереди, а мои предположения - нет.