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

Private GIT Repository
up
[Cipher_code.git] / OneRoundIoT / Delta / test2.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   uchar Sbox2[256];
108   rc4key(DK, Sbox1, 8);
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     plain[i]=0;
125   }
126   
127   
128   int size=1000*16;
129   double t=TimeStart(); 
130   for(int iter=0;iter<size;iter++) {
131     for(int j=0;j<bufsize;j++) {
132       Val[j]^=splitmix64_stateless(Val[Pbox[j]]);
133       cipher[j]=Val[j]^plain[j];
134     }
135
136     
137     if(iter%128==0) {
138
139       uchar *ptr=(uchar*)Val;
140       for(int j=0;j<bufsize*8;j++)
141         ptr[j]^=Sbox2[Sbox1[ptr[j]+DK[j&63]]];
142       rc4keyperm(ptr, bufsize, 1, Pbox, 16);      
143       rc4key(ptr, Sbox1, 64);
144       rc4key(&ptr[64], Sbox2, 64);
145     }
146   }
147
148   double time=TimeStop(t);
149   printf("time %e\n",size*bufsize*8/time);
150 }