Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Challenge - BAD PRNG

[es] :: Security :: Kriptografija i enkripcija :: Challenge - BAD PRNG

[ Pregleda: 2877 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Challenge - BAD PRNG06.04.2011. u 08:57 - pre 158 meseci
Code:

#include <string.h>
#include <time.h>

#define CHARSET_SIZE 62

/*
------------------------------------------------------------------------------
Standard definitions and types, Bob Jenkins
------------------------------------------------------------------------------
*/

#ifndef STANDARD
# define STANDARD
# ifndef STDIO
#  include <stdio.h>
#  define STDIO
# endif
# ifndef STDDEF
#  include <stddef.h>
#  define STDDEF
# endif
typedef  unsigned long long  ub8;
#define UB8MAXVAL 0xffffffffffffffffLL
#define UB8BITS 64
typedef    signed long long  sb8;
#define SB8MAXVAL 0x7fffffffffffffffLL
typedef  unsigned long  int  ub4;   /* unsigned 4-byte quantities */
#define UB4MAXVAL 0xffffffff
typedef    signed long  int  sb4;
#define UB4BITS 32
#define SB4MAXVAL 0x7fffffff
typedef  unsigned short int  ub2;
#define UB2MAXVAL 0xffff
#define UB2BITS 16
typedef    signed short int  sb2;
#define SB2MAXVAL 0x7fff
typedef  unsigned       char ub1;
#define UB1MAXVAL 0xff
#define UB1BITS 8
typedef    signed       char sb1;   /* signed 1-byte quantities */
#define SB1MAXVAL 0x7f
typedef                 int  word;  /* fastest type available */

#define bis(target,mask)  ((target) |=  (mask))
#define bic(target,mask)  ((target) &= ~(mask))
#define bit(target,mask)  ((target) &   (mask))
#ifndef min
# define min(a,b) (((a)<(b)) ? (a) : (b))
#endif /* min */
#ifndef max
# define max(a,b) (((a)<(b)) ? (b) : (a))
#endif /* max */
#ifndef align
# define align(a) (((ub4)a+(sizeof(void *)-1))&(~(sizeof(void *)-1)))
#endif /* align */
#ifndef abs
# define abs(a)   (((a)>0) ? (a) : -(a))
#endif
#define TRUE  1
#define FALSE 0
#define SUCCESS 0  /* 1 on VAX */

#endif /* STANDARD */

/*
------------------------------------------------------------------------------
definitions for a random number generator
By Bob Jenkins, 1996, Public Domain
MODIFIED:
  960327: Creation (addition of randinit, really)
  970719: use context, not global variables, for internal state
  980324: renamed seed to flag
  980605: recommend RANDSIZL=4 for noncryptography.
  010626: note this is public domain
------------------------------------------------------------------------------
*/

#ifndef RAND
#define RAND
#define RANDSIZL   (8)
#define RANDSIZ    (1<<RANDSIZL)

/* context of random number generator */
struct randctx
{
  ub4 randcnt;
  ub4 randmem[RANDSIZ];
  ub4 randrsl[RANDSIZ];
  ub4 randa;
  ub4 randb;
  ub4 randc;
};
typedef  struct randctx  randctx;

/*
------------------------------------------------------------------------------
 If (flag==TRUE), then use the contents of randrsl[0..RANDSIZ-1] as the seed.
------------------------------------------------------------------------------
*/
void randinit(/*_ randctx *r, word flag _*/);


/*
------------------------------------------------------------------------------
 Call rand(/o_ randctx *r _o/) to retrieve a single 32-bit random value
------------------------------------------------------------------------------
*/
#define rand(r) \
   (!(r)->randcnt-- ? \
     (isaac(r), (r)->randcnt=RANDSIZ-1, (r)->randrsl[(r)->randcnt]) : \
     (r)->randrsl[(r)->randcnt])

#endif  /* RAND */


#define ind(mm,x)  ((mm)[(x>>2)&(RANDSIZ-1)])
#define rngstep(mix,a,b,mm,m,m2,r,x) \
{ \
  x = *m;  \
  a = ((a^(mix)) + *(m2++)); \
  *(m++) = y = (ind(mm,x) + a + b); \
  *(r++) = b = (ind(mm,y>>RANDSIZL) + x) & 0xffffffff; \
}

void     isaac(ctx)
randctx *ctx;
{
   ub4 a,b,x,y,*m,*mm,*m2,*r,*mend;
   mm=ctx->randmem; r=ctx->randrsl;
   a = ctx->randa; b = ctx->randb + (++ctx->randc);
   for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; )
   {
      rngstep( a<<13, a, b, mm, m, m2, r, x);
      rngstep( (a & 0xffffffff) >>6 , a, b, mm, m, m2, r, x);
      rngstep( a<<2 , a, b, mm, m, m2, r, x);
      rngstep( (a & 0xffffffff) >>16, a, b, mm, m, m2, r, x);
   }
   for (m2 = mm; m2<mend; )
   {
      rngstep( a<<13, a, b, mm, m, m2, r, x);
      rngstep( (a & 0xffffffff) >>6 , a, b, mm, m, m2, r, x);
      rngstep( a<<2 , a, b, mm, m, m2, r, x);
      rngstep( (a & 0xffffffff) >>16, a, b, mm, m, m2, r, x);
   }
   ctx->randb = b; ctx->randa = a;
}


#define mix(a,b,c,d,e,f,g,h) \
{ \
   a^=b<<11;              d+=a; b+=c; \
   b^=(c&0xffffffff)>>2;  e+=b; c+=d; \
   c^=d<<8;               f+=c; d+=e; \
   d^=(e&0xffffffff)>>16; g+=d; e+=f; \
   e^=f<<10;              h+=e; f+=g; \
   f^=(g&0xffffffff)>>4;  a+=f; g+=h; \
   g^=h<<8;               b+=g; h+=a; \
   h^=(a&0xffffffff)>>9;  c+=h; a+=b; \
}

/* if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. */
void randinit(ctx, flag)
randctx *ctx;
word     flag;
{
   word i;
   ub4 a,b,c,d,e,f,g,h;
   ub4 *m,*r;
   ctx->randa = ctx->randb = ctx->randc = 0;
   m=ctx->randmem;
   r=ctx->randrsl;
   a=b=c=d=e=f=g=h=0x9e3779b9;  /* the golden ratio */

   for (i=0; i<4; ++i)          /* scramble it */
   {
     mix(a,b,c,d,e,f,g,h);
   }

   if (flag) 
   {
     /* initialize using the contents of r[] as the seed */
     for (i=0; i<RANDSIZ; i+=8)
     {
       a+=r[i  ]; b+=r[i+1];
       c+=r[i+2]; d+=r[i+3];
       e+=r[i+4]; f+=r[i+5];
       g+=r[i+6]; h+=r[i+7];
       mix(a,b,c,d,e,f,g,h);
       m[i  ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
       m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
     }
     /* do a second pass to make all of the seed affect all of m */
     for (i=0; i<RANDSIZ; i+=8)
     {
       a+=m[i  ]; b+=m[i+1];
       c+=m[i+2]; d+=m[i+3];
       e+=m[i+4]; f+=m[i+5];
       g+=m[i+6]; h+=m[i+7];
       mix(a,b,c,d,e,f,g,h);
       m[i  ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
       m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
     }
   }
   else
   {
     for (i=0; i<RANDSIZ; i+=8)
     {
       /* fill in mm[] with messy stuff */
       mix(a,b,c,d,e,f,g,h);
       m[i  ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
       m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
     }
   }

   isaac(ctx);            /* fill in the first set of results */
   ctx->randcnt=RANDSIZ;  /* prepare to use the first set of results */
}

/************************
* Main code
************************/

randctx ctx;

void init_prng(unsigned char *seed) {
    int i = 0,n=(int)strlen(seed);
    ub4 t = time(NULL);
    
    /* loop on seed and expand it */
    for (i=0;i<256;i++)
    {
        t = ((t+1)*seed[i%n] + 0xC0DEC0DE);
        ctx.randrsl[i] = t;
    }
    randinit(&ctx, TRUE);        


int main(int argc, char **argv)
{
    int i,j=0;
    char charset[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-!$%*+[]()";
    unsigned char idx[9],t=0;

    if (argc==2)
    {
        /* initialize our CSPRNG */
        ctx.randa=ctx.randb=ctx.randc=(ub4)0;
        init_prng(argv[1]);
            
        /* generate random values */
        isaac(&ctx);
        for (i=0;i<8;i++)
        {
            idx[i] = charset[((unsigned char)(ctx.randrsl[i<<6]) + t)%CHARSET_SIZE];
            t = idx[i];
        }
        idx[8] = '\0';
        
        /* display the password */
        printf("Your random password: %s\n", idx);
    }
    else
        printf("Serial Ownage's safe random password generator v1.2\n\nUsage: %s [seed]\n\n", argv[0]);
    return 0;
}


mali challenge ,ako neko hoce da se zamlacuje
bio na jednom CTFu sad za vikend , na zalost , nisam ga ulovio na vreme ...
gde je , kakva je , greska ?
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Challenge - BAD PRNG06.04.2011. u 09:01 - pre 158 meseci
A ko kaže da ima neka greška? U čemu je problem?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Re: Challenge - BAD PRNG06.04.2011. u 09:26 - pre 158 meseci
greska postoji , ne generise skroz random lozinke
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Challenge - BAD PRNG06.04.2011. u 09:35 - pre 158 meseci
Kako misliš "skroz random"? Šta si hteo da kažeš? Da se ove lozinke mogu napasti? OK, šta je poznato na početku? Seme koje korisnik ukucao kada je pokretao program?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Challenge - BAD PRNG06.04.2011. u 09:37 - pre 158 meseci
Čekaj, ako je ovo zadatak, prepiši formulaciju doslovno.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Re: Challenge - BAD PRNG06.04.2011. u 09:46 - pre 158 meseci
ok , izvini na nepreciznosti
meni je bilo jasno zato sto sam znao kontekst
kad sad pogledam , vidim da nije dovoljno

evo citavog zadatka
http://repo.shell-storm.org/CT...CRYPTO/CRYPTO200/crypto200.zip
cilj je bio dekriptovati sliku

ali je poenta u ovom generatoru lozinki , meni je promakla greska
iz timestamp-a slike mozes da zakljucis vreme kada je lozinka generisana (+- n sekundi)
pa onda uz slabost generatora , dodjes do lozinke
 
Odgovor na temu

[es] :: Security :: Kriptografija i enkripcija :: Challenge - BAD PRNG

[ Pregleda: 2877 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.