Back to Code Snippets / Powrót do Strzępów Kodu


#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;
}

Add a comment:

Nick:
URL (optional):
Math captcha: 7 ∗ 6 + 8 =