#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* to by trzeba slicznie zoptymalizowac jeszcze ;p
* zakladam poprawne warunki poczatkowe ;>
*
* len - jaka dlugosc ciagu nas interesuje
* charset - pointer na tablice ze znakami ktore nas interesuja
* np. "abcdefghijklmnopqrstuvwxyz"
* charset_len - ilosc znakow w tej tablicy
* start_point - pointer na tablice intow z poczatkowymi warunkami
* np dla przypadku wyzej i ciagu 4rech liter tablica
* { 0,0,0,0 } oznacza ciag "aaaa", a tablica
* { 1,2,3,4 } oznacza ciag "bcde"
* end_point - pointer na tablice intow z koncowymi warunkami, koncowy
* warunek bedzie tez sprawdzony/wygenerowany.. np ustawienie
* warunku poczatkowego na { 0,0,0,0 } a koncowego na
* { 25,25,25,25 } dla przylkadu wyzej spowoduje sprawdznie
* wszystkich kombinacji (25 == ilosc_liter (26) - 1 ;>)
*/
int
brute( int len, const char *charset, int charset_len,
int *start_point, int *end_point )
{
int point[ 64 ]; /* 64 wystarczy.. i tak nikt dluzszego ciagu nie bedzie chcial ;p */
int i; /* ur daily iterator */
char variant[ 64 ];
int end_it_sirth_spare_me_the_discrace = 0;
/* start_point -> point */
memcpy( point, start_point, len * sizeof( int ) );
/* go go go */
while( !end_it_sirth_spare_me_the_discrace )
{
/* koniec? */
if( memcmp( point, end_point, len * sizeof( int ) ) == 0 )
end_it_sirth_spare_me_the_discrace = 1;
/* fill the variant (of tylu ;p) */
for( i = len-1; i >= 0; i-- )
variant[ (len-1)-i ] = charset[ point[ i ] ];
variant[ len ] = '\0';
/* tutaj jakies sprawdzenie or sth */
puts( variant ); /* w tym przypadku po prostu wypisanie */
/* rownie dobrze moglo by byc if( memcmp( md5(variant,len), sprawdzany_ciag, 16 ) == 0 ) { ... } ;p */
/* iteracja
* XXX w pewnym momencie i+1 == len.. wiec trzeba pamiec
* zeby tablica point byla wieksza przynajmniej o jeden element
* od len
*/
point[ 0 ]++;
for( i = 0; i < len; i++ )
{
point[ i+1 ] += point[ i ] / charset_len;
point[ i ] %= charset_len;
}
}
return 0;
}
int
main( void )
{
#define SZ (sizeof(charset)-1)
#define LEN (sizeof(poczatek)/sizeof(int))
char
charset[] = "abcdefghijkmlnopqrstuvwxyz";
/*"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"*/
int
poczatek[ ] = {0,0},
koniec[ ] = {SZ-1,SZ-1};
brute( LEN, charset, SZ, poczatek, koniec );
return 0;
}
Back to Code Snippets / Powrót do Strzępów Kodu
Add a comment: