
20.02.2008, 12:19
|
|
Участник форума
Регистрация: 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..
|
|
|