]> AND Private Git Repository - Cipher_code.git/blob - OneRoundIoT/NEW/test.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
update
[Cipher_code.git] / OneRoundIoT / NEW / test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <sys/time.h>
5
6
7 typedef unsigned char uchar;
8
9 uint64_t xorshift64( const uint64_t state)
10 {
11   uint64_t x = state;
12   x^= x << 13;
13   x^= x >> 7;
14   x^= x << 17;
15   return x;
16 }
17
18 static inline uint64_t splitmix64_stateless(uint64_t index) {
19   uint64_t z = (index + UINT64_C(0x9E3779B97F4A7C15));
20   z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9);
21   z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB);
22   return z ^ (z >> 31);
23 }
24
25 double TimeStart()
26 {
27   struct timeval tstart;
28   gettimeofday(&tstart,0);
29   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
30 }
31
32 double TimeStop(double t)
33 {
34   struct timeval tend;
35
36   gettimeofday(&tend,0);
37   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
38   return (t);
39 }
40
41
42 uint xorshift32(const uint t)
43 {
44   /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
45   uint x = t;
46   x ^= x << 13;
47   x ^= x >> 17;
48   x ^= x << 5;
49   return x;
50 }
51
52
53 void rc4key(uchar *key, uchar *sc, int size_DK) {
54
55   for(int i=0;i<256;i++) {
56     sc[i]=i;
57   }
58
59
60   uchar j0 = 0;
61   for(int i0=0; i0<256; i0++) {
62     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
63     uchar tmp = sc[i0];
64     sc[i0] = sc[j0 ];
65     sc[j0] = tmp;
66   }
67 }
68
69
70 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
71
72   //sc=1:len;
73
74
75
76   for (int i=0;i<len;i++) {
77     sc[i]=i;
78   }
79   for (int it = 0; it < rp; it++) {
80     int j0 = 1;
81     for(int i0 = 0; i0<len; i0++) {
82       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
83       int tmp = sc[i0];
84       sc[i0] = sc[j0];
85       sc[j0] = tmp;
86     }
87
88   }
89 }
90
91
92 int main() {
93   printf("%d %d \n",sizeof(__uint64_t),sizeof(ulong));
94
95
96   uint64_t val=1021;
97   uint64_t val2=1021;
98
99   uint r1=21,r2=93;
100
101   uchar DK[64];
102   for(int i=0;i<64;i++)
103     DK[i]=splitmix64_stateless(i);
104
105
106   uchar Sbox1[256];
107   rc4key(DK, Sbox1, 8);
108   uchar Sbox2[256];
109   rc4key(&DK[8], Sbox2, 8);
110
111   const int bufsize=4096;
112   int Pbox[bufsize];
113   rc4keyperm(&DK[16], bufsize, 1, Pbox, 16);
114
115
116   int plain[bufsize];
117   int cipher[bufsize];
118   
119
120
121   uint64_t Val[bufsize];
122   for(int i=0;i<bufsize;i++)
123     Val[i]=splitmix64_stateless(i+DK[i&63]);
124   
125   
126   int size=1000*16;
127   double t=TimeStart(); 
128   for(int iter=0;iter<size;iter++) {
129     for(int j=0;j<bufsize;j++) {
130       Val[j]^=xorshift64(Val[Pbox[j]])^plain[j];
131     }
132
133     
134     if(iter%128==0) {
135
136       uchar *ptr=(uchar*)Val;
137       for(int j=0;j<bufsize*8;j++)
138         ptr[j]^=Sbox2[Sbox1[ptr[j]+DK[j&63]]];
139       rc4keyperm(ptr, bufsize, 1, Pbox, 16);      
140
141     }
142   }
143
144   double time=TimeStop(t);
145   printf("time %e\n",size*bufsize*8/time);
146 }