Вопрос

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

Это было полезно?

Решение

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

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

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 через количество перестановки и кодирует значение с размером вашего набора символов в качестве базы. Это может быть масштабировано до размера вашего символа довольно легко.

(псевдокод, но вы понимаете)


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))


Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top