Welcome Guest [Log In] [Register]
Welcome to Crypto. We hope you enjoy your visit.


You're currently viewing our forum as a guest. This means you are limited to certain areas of the board and there are some features you can't use. If you join our community, you'll be able to access member-only sections, and use many member-only features such as customizing your profile, sending personal messages, and voting in polls. Registration is simple, fast, and completely free.


Join our community!


If you're already a member please log in to your account to access all of our features:

Username:   Password:
Add Reply
Lfsrs And Prng
Topic Started: May 13 2006, 02:54 PM (217 Views)
loki
Advanced Member
[ *  *  * ]
Code:
 

/* modified LFSR and Simplied MERSENNE TWISTER GENERATOR
  Developed by LOKI for submission to The Crypto Forum
 
  LFSRs have long been used as a pseudo-random number
  generator for use in stream ciphers (especially in military
  cryptography), due to the ease of construction from simple
  electromechanical or electronic circuits, long periods, and
  very uniformly distributed outputs. However the outputs of
  LFSRs are completely linear, leading to fairly easy cryptanalysis.
 
  The Mersenne twister is a pseudorandom number generator developed
   in 1997 by Makoto Matsumoto and Takuji Nishimura. It provides for
   fast generation of very high quality pseudorandom numbers, having
   been designed specifically to rectify many of the flaws found in
   older algorithms.
   
  */

#include <stdio.h>
#define mask_lfsr 0x80000057UL


static unsigned long ShiftRegister=0;

void seed_LFSR(unsigned long seed) {
   if (seed == 0) /* avoid calamity */
       seed = 1;
ShiftRegister = seed;
}

int LFSR(void) {
int i;
unsigned long a[624];

        a[0]=19937;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister ^= (a[i] ^ mask_lfsr);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister ^= (a[i] ^ mask_lfsr);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister ^= (a[i] ^ mask_lfsr);
        }        

 ShiftRegister ^= ((((ShiftRegister >> 7)
      ^ (ShiftRegister << 5)
      ^ (ShiftRegister >> 3)
      ^ (ShiftRegister << 2)
      ^ (ShiftRegister >> 1)
      ^ ShiftRegister )
      & 1 ) << 31 )
      | ( ShiftRegister << 1 );
     
 ShiftRegister &= 0x00000001;
 return ShiftRegister;
}

int main(void) {
   int i;
   
   printf("LFSR : Using no seed\n");
   for(i=0;i<32;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }
                   
   printf("\n\nLFSR : Using seed %u\n", 1);
   seed_LFSR(1);
   
       for(i=0;i<32;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }
                       
   printf("\n\nLFSR : Using seed %u\n", 2);
   seed_LFSR(2);
   
       for(i=0;i<32;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }
   printf("\n\nLFSR : Using seed %u\n", 3);
   seed_LFSR(4);
   
       for(i=0;i<32;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }
                           
   printf("\n\nLFSR : Using seed %u\n", mask_lfsr);
   seed_LFSR(0x80000057);
   
       for(i=0;i<32;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }
   
   printf("\n\nprinting 512 bits using seed %u\n", 0x9908B0DF);
   seed_LFSR(0x9908B0DF);
       for(i=0;i<512;i++) {
                        LFSR();
                        printf("%u", ShiftRegister);
                        }    
   return 0;
}
c(x) = 3x3 + x2 + x + 2; Find the inverse
Offline Profile Quote Post Goto Top
 
loki
Advanced Member
[ *  *  * ]
I didn't notice a few errors in the above submission. Here is my latest implementation. Since its 1 30 am right now I am not in the mood to start converting the defines and varibles into arrays and use just one lfsr. So please forgive the overloaded code at the moment, until I do it.

Version 2:

linear congruential generator based on 8 linear feedback shift registers.

Code:
 

#include <stdio.h>
#include <math.h>
#define MODMULT(a,b,c,m,s) q = a/s; s = b*(s-a*q) - c*q; if (s<0) s+=m;
#define mask_lfsr0 0x80000057UL
#define mask_lfsr1 0x8E7F8157UL
#define mask_lfsr2 0x8F819257UL
#define mask_lfsr3 0x8192A357UL
#define mask_lfsr4 0x82A3B457UL
#define mask_lfsr5 0x83B4C557UL
#define mask_lfsr6 0x84C5D657UL
#define mask_lfsr7 0x85D6E757UL

unsigned long ShiftRegister0 = 0;
unsigned long ShiftRegister1 = 0;
unsigned long ShiftRegister2 = 0;
unsigned long ShiftRegister3 = 0;
unsigned long ShiftRegister4 = 0;
unsigned long ShiftRegister5 = 0;
unsigned long ShiftRegister6 = 0;
unsigned long ShiftRegister7 = 0;

unsigned long x[7];

unsigned long clcg(void);
void init_lcg(unsigned long initX0, unsigned long initX1,
            unsigned long initX2, unsigned long initX3,
            unsigned long initX4, unsigned long initX5,
            unsigned long initX6, unsigned long initX7);
void seed_lfsr(unsigned long seed);
unsigned long LFSR0(void); unsigned long LFSR1(void);
unsigned long LFSR2(void); unsigned long LFSR3(void);
unsigned long LFSR4(void); unsigned long LFSR5(void);
unsigned long LFSR6(void); unsigned long LFSR7(void);

int main(void) {
   int i;
   unsigned long lcg;
   seed_lfsr(19);
   init_lcg(LFSR0(), LFSR1(), LFSR2(), LFSR3(), LFSR4(), LFSR5(), LFSR6(), LFSR7());

   for(i=0;i<10;i++) {
                      printf("%u\n", clcg());
   }

   return 0;
}


unsigned long clcg(void) {
 unsigned long q;
 unsigned long z;

 MODMULT(50021, 40009, 16001, 2147483999UL, x[0])
 MODMULT(50033, 40039, 16061, 2147483929UL, x[1])
 MODMULT(50051, 40099, 16073, 2147483869UL, x[2])
 MODMULT(50069, 40129, 16103, 2147483813UL, x[3])
 MODMULT(50087, 40169, 16141, 2147483783UL, x[4])
 MODMULT(50101, 40213, 16193, 2147483777UL, x[5])
 MODMULT(50119, 40253, 16231, 2147483659UL, x[6])
 MODMULT(50129, 40343, 16747, 2147483629UL, x[7])
 z = (x[0] - x[1]) + (x[2] - x[3]) + (x[4] - x[5]) + (x[6] - x[7]);
 if ( z < 1 )
   z += 2147483562;
 return z * 5;
}

void init_lcg(unsigned long initX0, unsigned long initX1,
            unsigned long initX2, unsigned long initX3,
            unsigned long initX4, unsigned long initX5,
            unsigned long initX6, unsigned long initX7) {
 x[0] = initX0;
 x[1] = initX1;
 x[2] = initX2;
 x[3] = initX3;
 x[4] = initX4;
 x[5] = initX5;
 x[6] = initX6;
 x[7] = initX7;
}

void seed_lfsr(unsigned long seed) {
   if (seed == 0) /* avoid calamity */
       seed = 1;
ShiftRegister0 = seed + mask_lfsr0;
ShiftRegister1 = seed + mask_lfsr1;
ShiftRegister2 = seed + mask_lfsr2;
ShiftRegister3 = seed + mask_lfsr3;
ShiftRegister4 = seed + mask_lfsr4;
ShiftRegister5 = seed + mask_lfsr5;
ShiftRegister6 = seed + mask_lfsr6;
ShiftRegister7 = seed + mask_lfsr7;
}


unsigned long LFSR0(void) {
int i;
unsigned long a[624];

        a[0]=19937;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister0 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister0 ^= (a[i] ^ mask_lfsr0);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister0 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister0 ^= (a[i] ^ mask_lfsr0);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister1 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister0 ^= (a[i] ^ mask_lfsr0);
        }        

 ShiftRegister0 ^= ((((ShiftRegister0 >> 7)
      ^ (ShiftRegister0 << 5)
      ^ (ShiftRegister0 >> 3)
      ^ (ShiftRegister0 << 2)
      ^ (ShiftRegister0 >> 1)
      ^ ShiftRegister0 )
      & 1 ) << 31 )
      | ( ShiftRegister0 << 1 );
     
 ShiftRegister0 &= 0x000000FFUL;
 return ShiftRegister0;
}

unsigned long LFSR1(void) {
int i;
unsigned long a[624];

        a[0]=39877;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister1 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister1 ^= (a[i] ^ mask_lfsr1);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister1 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister1 ^= (a[i] ^ mask_lfsr1);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister1 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister1 ^= (a[i] ^ mask_lfsr1);
        }        

 ShiftRegister1 ^= ((((ShiftRegister1 >> 7)
      ^ (ShiftRegister1 << 5)
      ^ (ShiftRegister1 >> 3)
      ^ (ShiftRegister1 << 2)
      ^ (ShiftRegister1 >> 1)
      ^ ShiftRegister1 )
      & 1 ) << 31 )
      | ( ShiftRegister1 << 1 );
     
 ShiftRegister1 &= 0x000000FFUL;
 return ShiftRegister1;
}

unsigned long LFSR2(void) {
int i;
unsigned long a[624];

        a[0]=13291;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister2 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister2 ^= (a[i] ^ mask_lfsr2);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister2 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister2 ^= (a[i] ^ mask_lfsr2);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister2 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister2 ^= (a[i] ^ mask_lfsr2);
        }        

 ShiftRegister2 ^= ((((ShiftRegister2 >> 7)
      ^ (ShiftRegister2 << 5)
      ^ (ShiftRegister2 >> 3)
      ^ (ShiftRegister2 << 2)
      ^ (ShiftRegister2 >> 1)
      ^ ShiftRegister2 )
      & 1 ) << 31 )
      | ( ShiftRegister2 << 1 );
     
 ShiftRegister2 &= 0x000000FFUL;
 return ShiftRegister2;
}


unsigned long LFSR3(void) {
int i;
unsigned long a[624];

        a[0]=26591;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister3 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister3 ^= (a[i] ^ mask_lfsr3);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister3 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister3 ^= (a[i] ^ mask_lfsr3);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister3 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister3 ^= (a[i] ^ mask_lfsr3);
        }        

 ShiftRegister3 ^= ((((ShiftRegister3 >> 7)
      ^ (ShiftRegister3 << 5)
      ^ (ShiftRegister3 >> 3)
      ^ (ShiftRegister3 << 2)
      ^ (ShiftRegister3 >> 1)
      ^ ShiftRegister3 )
      & 1 ) << 31 )
      | ( ShiftRegister3 << 1 );
     
 ShiftRegister3 &= 0x000000FFUL;
 return ShiftRegister3;
}

unsigned long LFSR4(void) {
int i;
unsigned long a[624];

        a[0]=8861;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister4 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister4 ^= (a[i] ^ mask_lfsr4);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister4 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister4 ^= (a[i] ^ mask_lfsr4);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister4 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister4 ^= (a[i] ^ mask_lfsr4);
        }        

 ShiftRegister4 ^= ((((ShiftRegister4 >> 7)
      ^ (ShiftRegister4 << 5)
      ^ (ShiftRegister4 >> 3)
      ^ (ShiftRegister4 << 2)
      ^ (ShiftRegister4 >> 1)
      ^ ShiftRegister4 )
      & 1 ) << 31 )
      | ( ShiftRegister4 << 1 );
     
 ShiftRegister4 &= 0x000000FFUL;
 return ShiftRegister4;
}

unsigned long LFSR5(void) {
int i;
unsigned long a[624];

        a[0]=62039;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister5 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister5 ^= (a[i] ^ mask_lfsr5);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister5 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister5 ^= (a[i] ^ mask_lfsr5);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister5 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister5 ^= (a[i] ^ mask_lfsr5);
        }        

 ShiftRegister5 ^= ((((ShiftRegister5 >> 7)
      ^ (ShiftRegister5 << 5)
      ^ (ShiftRegister5 >> 3)
      ^ (ShiftRegister5 << 2)
      ^ (ShiftRegister5 >> 1)
      ^ ShiftRegister5 )
      & 1 ) << 31 )
      | ( ShiftRegister5 << 1 );
     
 ShiftRegister5 &= 0x000000FFUL;
 return ShiftRegister5;
}

unsigned long LFSR6(void) {
int i;
unsigned long a[624];

        a[0]=17;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister6 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister6 ^= (a[i] ^ mask_lfsr6);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister6 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister6 ^= (a[i] ^ mask_lfsr6);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister6 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister6 ^= (a[i] ^ mask_lfsr6);
        }        

 ShiftRegister6 ^= ((((ShiftRegister6 >> 7)
      ^ (ShiftRegister6 << 5)
      ^ (ShiftRegister6 >> 3)
      ^ (ShiftRegister6 << 2)
      ^ (ShiftRegister6 >> 1)
      ^ ShiftRegister6 )
      & 1 ) << 31 )
      | ( ShiftRegister6 << 1 );
     
 ShiftRegister6 &= 0x000000FFUL;
 return ShiftRegister6;
}

unsigned long LFSR7(void) {
int i;
unsigned long a[624];

        a[0]=41381;
        for(i=1;i<227;i++) {
            a[i] ^= ((ShiftRegister7 >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            ShiftRegister7 ^= (a[i] ^ mask_lfsr7);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((ShiftRegister7 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            ShiftRegister7 ^= (a[i] ^ mask_lfsr7);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((ShiftRegister7 >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            ShiftRegister7 ^= (a[i] ^ mask_lfsr7);
        }        

 ShiftRegister7 ^= ((((ShiftRegister7 >> 7)
      ^ (ShiftRegister7 << 5)
      ^ (ShiftRegister7 >> 3)
      ^ (ShiftRegister7 << 2)
      ^ (ShiftRegister7 >> 1)
      ^ ShiftRegister7 )
      & 1 ) << 31 )
      | ( ShiftRegister7 << 1 );
     
 ShiftRegister7 &= 0x000000FFUL;
 return ShiftRegister7;
}
c(x) = 3x3 + x2 + x + 2; Find the inverse
Offline Profile Quote Post Goto Top
 
loki
Advanced Member
[ *  *  * ]
Version 2a: Reduced Version.

Code:
 

#include <stdio.h>

#define MODMULT(a,b,c,m,s) q = a/s; s = b*(s-a*q) - c*q; if (s<0) s+=m;

unsigned long mask_lfsr[8] = {0x80000057UL,
                             0x8E7F8157UL,
                             0x8F819257UL,
                             0x8192A357UL,
                             0x82A3B457UL,
                             0x83B4C557UL,
                             0x84C5D657UL,
                             0x85D6E757UL};
unsigned long a_vector[8] = {0x4DE1UL,
                            0x9BC5UL,
                            0x33EBUL,
                            0x67DFUL,
                            0x229DUL,
                            0xF257UL,
                            0x11UL,
                            0xA1A5UL};
unsigned long shiftregister[8];
unsigned long x[8];

/* function prototypes */
unsigned long clcg(void);
void init_lcg(unsigned long initX0, unsigned long initX1,
            unsigned long initX2, unsigned long initX3,
            unsigned long initX4, unsigned long initX5,
            unsigned long initX6, unsigned long initX7);
void seed_lfsr(unsigned long seed);
unsigned long lfsr(int n);

int main(void) {
   int i;
   unsigned long lcg;
   seed_lfsr(19);
   init_lcg(lfsr(0),lfsr(1),lfsr(2),lfsr(3),lfsr(4),lfsr(5),lfsr(6),lfsr(7));

   for(i=0;i<10;i++) {
                      printf("%u\n", clcg());
   }
   return 0;
}

unsigned long clcg(void) {
 unsigned long q;
 unsigned long z;

 MODMULT(50021, 40009, 16001, 2147483999UL, x[0])
 MODMULT(50033, 40039, 16061, 2147483929UL, x[1])
 MODMULT(50051, 40099, 16073, 2147483869UL, x[2])
 MODMULT(50069, 40129, 16103, 2147483813UL, x[3])
 MODMULT(50087, 40169, 16141, 2147483783UL, x[4])
 MODMULT(50101, 40213, 16193, 2147483777UL, x[5])
 MODMULT(50119, 40253, 16231, 2147483659UL, x[6])
 MODMULT(50129, 40343, 16747, 2147483629UL, x[7])
 z = (x[0] - x[1]) + (x[2] - x[3]) + (x[4] - x[5]) + (x[6] - x[7]);
 if ( z < 1 )
   z += 2147483562;
 return z * 5;
}

void init_lcg(unsigned long initX0, unsigned long initX1,
            unsigned long initX2, unsigned long initX3,
            unsigned long initX4, unsigned long initX5,
            unsigned long initX6, unsigned long initX7) {
 x[0] = initX0;
 x[1] = initX1;
 x[2] = initX2;
 x[3] = initX3;
 x[4] = initX4;
 x[5] = initX5;
 x[6] = initX6;
 x[7] = initX7;
}

void seed_lfsr(unsigned long seed) {
   int i;
   if (seed == 0) /* avoid calamity */
       seed = 1;
   
   for(i=0;i<8;i++)
   shiftregister[i] = seed + mask_lfsr[i];
}

unsigned long lfsr(int n) {
int i;
unsigned long a[624];

        a[0]=a_vector[n];
        for(i=1;i<227;i++) {
            a[i] ^= ((shiftregister[n] >> 1) ^ 0x9908B0DFUL);
            a[i] ^= a[i-1];
            shiftregister[n] ^= (a[i] ^ mask_lfsr[n]);
            }
        for(i=227;i<435;i++) {
            a[i] ^= ((shiftregister[n] >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-227]);
            shiftregister[n] ^= (a[i] ^ mask_lfsr[n]);
        }
        for(i=435;i<624;i++) {
            a[i] ^= ((shiftregister[n] >> 1) ^ 0x99B47ECEUL);
            a[i] ^= a[i-1];
            a[i] ^= (a[i] ^ a[i-435]);
            shiftregister[n] ^= (a[i] ^ mask_lfsr[n]);
        }        

 shiftregister[n] ^= ((((shiftregister[n] >> 7)
      ^ (shiftregister[n] << 5)
      ^ (shiftregister[n] >> 3)
      ^ (shiftregister[n] << 2)
      ^ (shiftregister[n] >> 1)
      ^ shiftregister[n] )
      & 1 ) << 31 )
      | ( shiftregister[n] << 1 );
     
 shiftregister[n] &= 0x000000FFUL;
 return shiftregister[n];
}
c(x) = 3x3 + x2 + x + 2; Find the inverse
Offline Profile Quote Post Goto Top
 
1 user reading this topic (1 Guest and 0 Anonymous)
« Previous Topic · General · Next Topic »
Add Reply