Показать сообщение отдельно

  #775  
Старый 20.02.2008, 12:19
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Цитата:
Сообщение от nitx  
Подскажите как сделать на С. Кароче нужно перепробовать все значения числа, переставляя цифры. Причем неизвестно из скольки цифер состоит число.
Например, в переменной задано число 21, его нужно прочитать как 1, 2, 12, 21.
P.s. я в С нуб
Вообще это алгоритм перебора паролей из выбранного набора символов для брутера
Их есть много у меня
Медленный, но удобный:
Код:
#define MAXstr		256
#define MAXsymbol	10
#define initdata(X,Y,Z) for(int x=0;x<(Y);x++) X[x]=Z
	int i;
	char s[MAXstr];
		sprintf((char *)&s,"%d",1221);

	int is[MAXsymbol];initdata(is,MAXsymbol,0);
	int length=0; 
	char sall[MAXsymbol];
		for (i=0;s[i]!=0;i++) is[s[i]-'0']=1;
		for (i=0;i<MAXsymbol;i++) if (is[i]==1) {sall[length]='0'+i;length++;};sall[length]=0;
		printf("integer %s = %s \n",s,sall);

	int size=1;
	int sizeold=size;
	char data[MAXsymbol],str[MAXstr];
#define incarray(X) data[X]++;if (data[X]==length) { data[X]=0; if (size<(X+2)) size++

		initdata(data,MAXsymbol,0);
		while (size<length+1) {

		for (i=0;i<MAXsymbol;i++) if (i<size){str[i]=sall[data[i]];}else{str[i]=0;}
		printf(" %s ",str);
		
		//hands make  
		incarray(0);incarray(1);incarray(2);incarray(3);incarray(4);
		incarray(5);incarray(6);incarray(7);incarray(8);incarray(9);
		}}}}}}}}}}// array to MAXsymbol	
		if (sizeold!=size) {initdata(data,MAXsymbol,0); sizeold=size; printf("\n");}
							}//while (size<length+1)
integer 1221 = 12
1 2
11 21 12 22

P.s.
Код:
//hands make  
incarray(0);incarray(1);incarray(2);incarray(3);incarray(4);
incarray(5);incarray(6);incarray(7);incarray(8);incarray(9);
}}}}}}}}}}// array to MAXsymbol
Можно заменить на автомат:
Код:
for (int X=0;X<MAXsymbol;X++) {
  data[X]++;if (data[X]==length) { data[X]=0; if (size<(X+2)) size++; } else break;					
		  }

Последний раз редактировалось Xserg; 20.02.2008 в 12:45..
 
Ответить с цитированием