]> AND Private Git Repository - Cipher_code.git/blob - Arduino/sketch_One_Round/sketch_One_Round.ino
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
improvement
[Cipher_code.git] / Arduino / sketch_One_Round / sketch_One_Round.ino
1 #include <AES.h>
2 //#include "./printf.h"
3
4
5
6 //#include <ESP8266WiFi.h>
7
8 const int size_mesg=256;
9
10
11
12
13 const int sleepTimeS = 10;
14
15
16 const int h=4;
17 const int h2=h*h;
18 byte DK[64];
19 int rp=1;
20
21 const int len=size_mesg/h2;
22
23
24
25 typedef byte   uchar;
26
27 int Pbox[len];
28   int PboxRM[h2];
29   uchar Sbox1[256];
30   uchar Sbox2[256];  
31   uchar RM1_cpy[h2];
32
33   
34
35
36
37
38
39
40
41
42 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
43
44   for(int i=0;i<size_tab;i++) {
45     inv_perm_tabs[tab[i]] = i;
46   }
47
48 }
49
50 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
51
52   for(int i=0;i<size_tab;i++) {
53     inv_perm_tabs[tab[i]] = i;
54   }
55
56 }
57
58
59
60 void rc4key(uchar *key, uchar *sc, int size_DK) {
61
62   for(int i=0;i<256;i++) {
63     sc[i]=i;
64   }
65
66
67   uchar j0 = 0;
68   for(int i0=0; i0<256; i0++) {
69     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
70     uchar tmp = sc[i0];
71     sc[i0] = sc[j0 ];
72     sc[j0] = tmp;
73   }
74 }
75
76
77
78 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
79
80   //sc=1:len;
81
82
83   
84   for (int i=0;i<len;i++) {
85     sc[i]=i;
86   }
87   for (int it = 0; it < rp; it++) {
88     int j0 = 1;
89     for(int i0 = 0; i0<len; i0++) {
90       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
91       int tmp = sc[i0];
92       sc[i0] = sc[j0];
93       sc[j0] = tmp;
94     }
95
96   }
97 }
98
99 void prga(uchar *sc, int ldata, uchar *r) {
100   uchar i0=0;
101   uchar j0=0;
102
103   for (int it=0; it<ldata; it++) {
104     i0 = ((i0+1)&0xFE); //%255);
105     j0 = (j0 + sc[i0])&0xFF;
106     uchar tmp = sc[i0];
107     sc[i0] = sc[j0];
108     sc[j0] = tmp;
109     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
110   }
111 }
112
113
114
115 void encrypt_ctr(const uchar* seq_in, uchar *seq_out, int len,uchar* RM1,const int *Pbox, const int *PboxRM, const uchar *Sbox1, const uchar *Sbox2, int enc) {
116
117  //printArray(seq_out,16);
118   uchar X[h2];
119   uchar fX[h2];
120   
121   int ind1,ind2;
122
123   
124    for(int a=0;a<h2;a++) {
125      X[a]=Sbox1[a&0xFF];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
126    }
127
128    
129   for(int it=0;it<len;it++) {
130     if(enc) {
131       ind1=it*h2;
132       ind2=Pbox[it]*h2;
133     }
134     else {
135       ind2=it*h2;
136       ind1=Pbox[it]*h2;
137     }
138     
139
140    for(int a=0;a<h2;a+=4) {
141       X[a]=X[Sbox1[a]];
142       X[a+1]=X[Sbox1[a+1]];
143       X[a+2]=X[Sbox1[a+2]];
144       X[a+3]=X[Sbox1[a+3]];
145     }
146
147     for(int a=0;a<h2;a+=4){
148       fX[a]=X[a];
149       fX[a+1]=X[a+1];
150       fX[a+2]=X[a+2];
151       fX[a+3]=X[a+3];
152     }
153    
154
155
156     //printf("fx %d\n",fX[0] );
157     
158   /*
159     for(int a=0;a<h2;a+=16) {
160       *(int*)&fX[a]^=it;
161       *(int*)&fX[a+4]^=it;
162       *(int*)&fX[a+8]^=it;
163       *(int*)&fX[a+12]^=it;
164     }  
165    */
166
167
168
169
170     for(int a=0;a<h2;a+=4) {
171       fX[a]=fX[a]^RM1[a];
172       fX[a+1]=fX[a+1]^RM1[a+1];
173       fX[a+2]=fX[a+2]^RM1[a+2];
174       fX[a+3]=fX[a+3]^RM1[a+3];
175     }
176
177  
178     for(int a=0;a<h2;a+=4) {
179       fX[a]=Sbox2[fX[a]];
180       fX[a+1]=Sbox2[fX[a+1]];
181       fX[a+2]=Sbox2[fX[a+2]];
182       fX[a+3]=Sbox2[fX[a+3]];
183     }
184     
185  
186
187     
188      for(int a=0;a<h2;a+=4) {
189       fX[a]=fX[a]^seq_in[ind2+a];
190       fX[a+1]=fX[a+1]^seq_in[ind2+a+1];
191       fX[a+2]=fX[a+2]^seq_in[ind2+a+2];
192       fX[a+3]=fX[a+3]^seq_in[ind2+a+3];
193     }
194
195
196  
197     for(int a=0;a<h2;a+=4) {
198       seq_out[ind1+a]=fX[a];
199       seq_out[ind1+a+1]=fX[a+1];
200       seq_out[ind1+a+2]=fX[a+2];
201       seq_out[ind1+a+3]=fX[a+3];
202     }
203     
204     for(int a=0;a<h2;a+=4) {
205       RM1[a]=RM1[PboxRM[a]];
206       RM1[a+1]=RM1[PboxRM[a+1]];
207       RM1[a+2]=RM1[PboxRM[a+2]];
208       RM1[a+3]=RM1[PboxRM[a+3]];
209     }
210
211
212     
213   }
214
215 //  printf("size mes %d\n",size_mesg);
216 //  printf("len %d\n",len);
217
218
219 //printArray(seq_out,16);
220
221 }
222
223
224
225 void printArray(byte *mes, int n) {
226   for (byte i = 0; i < n; i++) {
227     Serial.print(mes[i]);
228     Serial.print(" ");
229   }
230   Serial.println();
231 }
232
233
234 void setup ()
235 {
236   Serial.begin (57600) ;
237 //  printf_begin();
238   delay(500);
239   printf("\n===testng mode\n") ;
240
241
242   uchar sc[256];  
243   
244   uchar RM1[h2];
245   uchar RM2[h2];
246  
247   randomSeed(134);
248
249   for(byte i=0;i<64;i++) {
250     DK[i]=random(255);
251   }
252   rc4key(DK, Sbox1, 8);
253   
254   
255   rc4key(&DK[8], Sbox2, 8);
256   
257   rc4key(&DK[16], sc, 16);
258   
259   
260   prga(sc, h2, RM1);
261   
262   
263   rc4keyperm(&DK[32], len, rp, Pbox, 16);
264   
265   
266   rc4keyperm(&DK[48], h2, rp, PboxRM, 16);
267
268   for(int i=0;i<h2;i++){
269     RM2[i]=RM1[i];
270     RM1_cpy[i]=RM1[i];
271   }
272
273  //  WiFi.mode( WIFI_OFF );
274  
275 Serial.println("END OF INIT"); 
276   
277
278   
279 //  otfly_test () ;
280 //  otfly_test256 () ;
281 }
282
283 void loop () 
284 {
285   prekey_test () ;
286   delay(1000);
287
288 //  Serial.println("ESP8266 in sleep mode");
289  // ESP.deepSleep(sleepTimeS * 1000000, WAKE_RF_DISABLED );
290   delay(1000);
291 //  Serial.println("ESP8266 in normal mode");
292 }
293
294 void prekey (int bits)
295 {
296  
297  
298   byte plain[size_mesg];
299   byte cipher [size_mesg] ;
300   byte check [size_mesg] ;
301
302   randomSeed(334);
303   for(int i=0;i<size_mesg;i++) {
304     plain[i]=random(255);
305   }
306   
307   uchar RM1[h2];
308   uchar RM2[h2];
309  
310   for(int i=0;i<h2;i++){
311     RM1[i]=RM1_cpy[i];
312     RM2[i]=RM1_cpy[i];
313   }
314
315  
316  
317
318   unsigned long ms1 = micros ();
319   encrypt_ctr(plain, cipher,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1);
320   Serial.print("ONE   Encryption took: ");
321   Serial.println(micros() - ms1);
322   
323   ms1 = micros ();
324   encrypt_ctr(cipher, check,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0);
325   Serial.print("ONE   Decryption took: ");
326   Serial.println(micros() - ms1);
327
328   printf("\n\nPLAIN :");
329   printArray(plain,16*2);
330   printf("\nCIPHER:");
331   printArray(cipher,16*2);
332   printf("\nCHECK :");
333   printArray(check,16*2);
334   
335   bool equal=true;
336   for(int i=0;i<size_mesg;i++) {
337       
338       if(check[i]!=plain[i]) {
339         equal=false;
340       }
341     }
342   Serial.print("CHECK ");
343   Serial.println(equal);
344   
345 }
346
347 void prekey_test ()
348 {
349   prekey (128) ;
350 }
351
352