Перебор паролей

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by medved6216, 26 Mar 2011.

  1. medved6216

    medved6216 New Member

    Joined:
    26 Mar 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Мне пришла идея, куда интересней) Как убить двух зайцев одновременно. Создаем два потока. В первом генерируем 100 паролей и грузим их в файл pass.txt и заморажеваем операцию на определенный тайм-аут.Во-втором проверяем пароли на вход в прокси и чистим файл. и так всё по кругу, пока не подберет пароль. Убиваем вес файла, но очень долго будет проверяться. поэтому придется делать не 1 поток для проверки, а 100, на каждую проверку)
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Для таких целей лучше сделать функцию генерации, с запоминанием позиции.
    И при каждом обращении она генерит следующую комбинацию.
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Это если у тебя не изменяемая длина алфавита...
    Вот вывел методом тыка:
    Code:
    count - количество символов в алфавите
    min - минимальная длина пароля
    max - максимальная длина пароля
    
    // быстрое возведение в степень... как бы
    int st(int i,int k) 
    {
    	int res=1;
    	while(k)
    	{
    		if(k & 1) res *=t;
    		t *= t;
    		k >>= 1;
    	}
    	return res;
    }
    
    int permutations(int count,int min,int max)
    {
    	if(min==0) min=1;
    	int perm=st(count,max);
    	for(;min<max;min++) perm+=st(count,min);
    	return perm;
    }
    
    Эммм, а вот сколько для этого букф надо голова уже не варит :)
     
    _________________________
  4. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Терабайтные файлы и куча вложенных циклов подтверждают всю опасность русских хацкеров.

    Для пароля постоянной длины
    Code:
    #include <stdio.h>
    #include <string.h>
    
    #define PASSLEN 4
    int indexes[PASSLEN] = {'\0'};
    
    int passwd_iterator(char *buff)
    {
        char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    
        int right = PASSLEN - 1;
        int offset = 1;
    
        int i = 0;
        for (; i < PASSLEN; i++)
            buff[i] = alphabet[indexes[i]];
    
        if (++indexes[right] > sizeof(alphabet) - 2)
        {
            indexes[right] = 0;
            offset = right - 1;
    
            while (offset > -1)
            {
                if (indexes[offset] < sizeof(alphabet) - 2)
                {
                    indexes[offset]++;
                    break;
                }
                else
                {
                    indexes[offset] = 0;
                    offset--;
                }
            }
        }
    
        return offset;
    }
    
    int main()
    {
        char buff[PASSLEN+1] = {'\0'};
    
        int ret = 0;
        while (ret != -1)
        {
            ret = passwd_iterator(buff);
            printf("%s\n", buff);
        }
    
        return 0;
    }
    
    
    Почти тоже самое для пароля переменной длины.
    Code:
    #include <stdio.h>
    #include <string.h>
    
    #define PASSLENMAX 10
    int indexes[PASSLENMAX] = {'\0'};
    
    int passwd_iterator(char *buff, int passlen)
    {
        char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    
        int right = passlen - 1;
        int offset = 1;
    
        int i = 0;
        for (; i < passlen; i++)
            buff[i] = alphabet[indexes[i]];
    
        if (++indexes[right] > sizeof(alphabet) - 2)
        {
            indexes[right] = 0;
            offset = right - 1;
    
            while (offset > -1)
            {
                if (indexes[offset] < sizeof(alphabet) - 2)
                {
                    indexes[offset]++;
                    break;
                }
                else
                {
                    indexes[offset] = 0;
                    offset--;
                }
            }
        }
    
        return offset;
    }
    
    int main()
    {
        char buff[PASSLENMAX+1] = {'\0'};
    
        int len = 1;
        while (len < 5)
        {
            if (passwd_iterator(buff, len) == -1)
                len++;
            printf("%s\n", buff);
        }
    
        return 0;
    }
    
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    А еще проще заюзать вот это http://www.insidepro.com/doc/003r.shtml
    Добавить туда минимальную и максимальную длину пасса труда не составит, а вообще все уже написано :)
     
    _________________________