Нужна помощь с кодом грубой силы для склепа (3) - PullRequest
1 голос
/ 17 ноября 2009

Я пытаюсь разработать программу на C, которая будет "взламывать" шифрование crypt (3), используемое UNIX. Думаю, самый наивный способ сделать это - грубое принуждение. Я подумал, что должен создать массив, содержащий все символы, которые может иметь пароль, а затем получить все возможные их перестановки и сохранить их в двумерном массиве (где все пароли из 1 символа сохраняются в первой строке и т. Д.) В течение петли. Есть ли лучший способ сделать это? Это довольно грязно с петлями.

Ответы [ 2 ]

3 голосов
/ 17 ноября 2009

При условии, что можно использовать только 62 различных символа, для хранения всех возможных 8-символьных паролей требуется 62 ^ 8 = 198 терабайт.

Чтобы ответить на ваш loop вопрос, вот некоторый код для циклического перебора всех возможных паролей данного len, используя символы для данного набора:

int len = 3;
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int nbletters = sizeof(letters)-1;

int main() {
    int i, entry[len];
    for(i=0 ; i<len ; i++) entry[i] = 0;
    do {
        for(i=0 ; i<len ; i++) putchar(letters[entry[i]]);
        putchar('\n');
        for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0;
    } while(i<len);
}

Основная часть - последний цикл для . В большинстве случаев он только увеличивает первую запись и останавливается на ней, поскольку эта запись не достигла nbletters. Если запись достигает значения nbletter, это означает, что она должна вернуться к нулю, и это очередь следующей записи, которая должна быть увеличена. Это действительно необычное условие цикла: цикл продолжается до тех пор, пока не произойдет переполнение. Цикл происходит только в худшем случае: когда в последнем элементе несколько записей.

Представьте себе случай, когда текущее слово "zzzc". В свою очередь, каждая запись увеличивается, ее переполнение обнаруживается, оно сбрасывается в 0 и рассматривается следующая запись до последней записи, которая не переполняется, для выдачи «000d».

0 голосов
/ 17 ноября 2009

Как отмечают комментаторы в вопросе - у вас нет необходимой оперативной памяти, и вам не нужно хранить все это.

Покрытие перестановок в последовательности сортировки - не самый эффективный способ взлома пароля, хотя в конечном итоге он будет эффективным.

Подход к достижению полного охвата заключается в итерации 0 по количеству перестановок и кодировании значения с размером вашего набора символов в качестве основы. Это может быть легко масштабировано до размера вашего набора символов.

(псевдокод, но вы поняли)


passChars = '[all characters used in this attempt]'

permutationCount = 8^len(passChars) #crypt(3) only uses 8 chars

output = ''

for looper = 0 to permutationCount - 1
    localTemp = looper
    while localTemp > 0
        output += passchars[localTemp%len(passchars)] # % being modulus
        localTemp = floor(localTemp/len(passChars))


...