SAES.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. #include<iostream>
  2. #include<cmath>
  3. #include <map>
  4. #include<algorithm>
  5. #include<cstring>
  6. using namespace std;
  7. int binary_to_int[2][2]={0,1,2,3};
  8. int add_round_key_array[16]={0},multiplication_ans[16]={0};
  9. string int_to_binary[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
  10. string decryption_sbox[4][4]={"1010","0101","1001","1011","0001","0111","1000","1111","0110","0000","0010","0011","1100","0100","1101","1110"};
  11. bool myfunction (int i, int j) {
  12. return (i==j);
  13. }
  14. int binary_to_decimal_for_four_bits(int binary_num)
  15. {
  16. int final=0,count=0;
  17. while (binary_num>0)
  18. {
  19. final+=binary_num%10*pow(2,count);
  20. binary_num=binary_num/10;
  21. count++;
  22. }
  23. return final;
  24. }
  25. int * perform_multiplication(int nibbles[],int mul_factor_matrix[2][2],int size)
  26. {
  27. int S[2][2]={0},S_duplicate[2][2]={0},final[2][2]={0},i,j,k,temp,max;
  28. S[0][0]=binary_to_decimal_for_four_bits(nibbles[0]);
  29. S[0][1]=binary_to_decimal_for_four_bits(nibbles[2]);
  30. S[1][0]=binary_to_decimal_for_four_bits(nibbles[1]);
  31. S[1][1]=binary_to_decimal_for_four_bits(nibbles[3]);
  32. S_duplicate[0][0]=nibbles[0];
  33. S_duplicate[0][1]=nibbles[2];
  34. S_duplicate[1][0]=nibbles[1];
  35. S_duplicate[1][1]=nibbles[3];
  36. for(k=0;k<2;k++)
  37. for(i=0;i<2;i++)
  38. for(j=0;j<2;j++)
  39. if((mul_factor_matrix[k][j]*S[j][i])>15)
  40. {
  41. int divisor[6]={0,1,0,0,1,1},divisor2[7]={0,0,1,0,0,1,1},divident[7]={0},shifted_divisor[7]={0},count=0,temp_number=1000,divident_in_decimal_form=0;
  42. int vari,vari1;
  43. int divident2[7]={0};
  44. map<int,int> flag;
  45. temp=S_duplicate[j][i];
  46. vari=temp;
  47. vari1=temp_number;
  48. int vari2;
  49. vari2=temp;
  50. int vari3;
  51. vari3=temp_number;
  52. if(size==6)
  53. {
  54. while((temp)!=0)
  55. {
  56. if(temp!=0)
  57. divident[count]=temp/temp_number;
  58. count++;
  59. temp=temp%temp_number;
  60. temp_number=temp_number/10;
  61. }
  62. if(divident[0]==1)
  63. {
  64. shifted_divisor[0]=1;
  65. shifted_divisor[1]=0;
  66. shifted_divisor[2]=0;
  67. shifted_divisor[3]=1;
  68. shifted_divisor[4]=1;
  69. shifted_divisor[5]=0;
  70. for(int counter=0;counter<6;counter++)
  71. {
  72. divident[counter]=divident[counter]^shifted_divisor[counter];
  73. }
  74. while(divident[1]!=0)
  75. for(int counter=0;counter<6;counter++)
  76. {
  77. divident[counter]=divident[counter]^divisor[counter];
  78. }
  79. }
  80. else if(divident[1]==1)
  81. {
  82. while(divident[1]!=0)
  83. for(int counter=0;counter<6;counter++)
  84. divident[counter]=divident[counter]^divisor[counter];
  85. }
  86. int counter_var=3;
  87. for(int numm=2;numm<6;numm++)
  88. {
  89. divident_in_decimal_form+=divident[numm]*pow(2,counter_var);
  90. counter_var--;
  91. }
  92. //for(int counter=2;counter<6;counter++)
  93. final[k][i]=final[k][i]^divident_in_decimal_form;
  94. }
  95. else
  96. {
  97. count=0;
  98. if(mul_factor_matrix[k][j]==9)
  99. {
  100. int variable1[7]={0},variable2[7]={0},counter_varr;
  101. int another_var;
  102. another_var=vari;
  103. for(counter_varr=6;vari!=0;counter_varr--)
  104. {
  105. variable1[counter_varr]=vari%10;
  106. vari=vari/10;
  107. }
  108. flag[100000]=0;
  109. vari=another_var;
  110. counter_varr++;
  111. for(counter_varr=counter_varr;vari!=0;counter_varr--)
  112. {
  113. if(counter_varr>3&&flag[100000]!=1)
  114. {
  115. if(variable1[counter_varr-1]==0)
  116. {
  117. continue;
  118. }
  119. else
  120. {
  121. counter_varr--;
  122. continue;
  123. }
  124. flag[100000]=1;
  125. }
  126. else
  127. variable2[counter_varr]=vari%10;
  128. vari=vari/10;
  129. }
  130. for(counter_varr=0;counter_varr<7;counter_varr++)
  131. {
  132. divident2[counter_varr]=variable1[counter_varr]^variable2[counter_varr];
  133. }
  134. label: if(divident2[0]==1)
  135. {
  136. shifted_divisor[0]=1;
  137. shifted_divisor[1]=0;
  138. shifted_divisor[2]=0;
  139. shifted_divisor[3]=1;
  140. shifted_divisor[4]=1;
  141. shifted_divisor[5]=0;
  142. shifted_divisor[6]=0;
  143. for(int counter=0;counter<7;counter++)
  144. {
  145. divident2[counter]=divident2[counter]^shifted_divisor[counter];
  146. }
  147. goto label;
  148. }
  149. else if(divident2[1]==1)
  150. {
  151. shifted_divisor[0]=0;
  152. shifted_divisor[1]=1;
  153. shifted_divisor[2]=0;
  154. shifted_divisor[3]=0;
  155. shifted_divisor[4]=1;
  156. shifted_divisor[5]=1;
  157. shifted_divisor[6]=0;
  158. for(int counter=0;counter<7;counter++)
  159. {
  160. divident2[counter]=divident2[counter]^shifted_divisor[counter];
  161. }
  162. goto label;
  163. }
  164. else if(divident2[2]==1)
  165. {
  166. for(int counter=0;counter<7;counter++)
  167. {
  168. divident2[counter]=divident2[counter]^divisor2[counter];
  169. }
  170. }
  171. int counter_var=3;
  172. divident_in_decimal_form=0;
  173. for(int numm=3;numm<7;numm++)
  174. {
  175. divident_in_decimal_form+=divident2[numm]*pow(2,counter_var);
  176. counter_var--;
  177. }
  178. final[k][i]=final[k][i]^divident_in_decimal_form;
  179. }
  180. else
  181. {
  182. vari1=100000;
  183. while((vari)!=0)
  184. {
  185. if(vari!=0)
  186. divident2[count]=vari/vari1;
  187. count++;
  188. vari=vari%vari1;
  189. vari1=vari1/10;
  190. }
  191. if(divident2[2]==1)
  192. {
  193. shifted_divisor[0]=0;
  194. shifted_divisor[1]=0;
  195. shifted_divisor[2]=1;
  196. shifted_divisor[3]=0;
  197. shifted_divisor[4]=0;
  198. shifted_divisor[5]=1;
  199. shifted_divisor[6]=1;
  200. for(int counter=0;counter<7;counter++)
  201. {
  202. divident2[counter]=divident2[counter]^shifted_divisor[counter];
  203. }
  204. }
  205. int counter_var=3;
  206. divident_in_decimal_form=0;
  207. for(int numm=3;numm<7;numm++)
  208. {
  209. divident_in_decimal_form+=divident2[numm]*pow(2,counter_var);
  210. counter_var--;
  211. }
  212. final[k][i]=final[k][i]^divident_in_decimal_form;
  213. }
  214. }
  215. }
  216. else
  217. final[k][i]=final[k][i]^(mul_factor_matrix[k][j]*S[j][i]);
  218. string answer_in_4_bits[4];
  219. int var=0;
  220. for(i=0;i<2;i++)
  221. {
  222. for(int j=0;j<2;j++)
  223. {
  224. answer_in_4_bits[var]=int_to_binary[final[j][i]];
  225. var++;
  226. }
  227. }
  228. int final_ans[16],number=0;
  229. string dec_num= answer_in_4_bits[0];
  230. for(int variable=0;variable<4;variable++)
  231. {
  232. final_ans[number] = dec_num[variable]-48;
  233. number++;
  234. }
  235. dec_num= answer_in_4_bits[1];
  236. for(int variable=0;variable<4;variable++)
  237. {
  238. final_ans[number] = dec_num[variable]-48;
  239. number++;
  240. }
  241. dec_num= answer_in_4_bits[2];
  242. for(int variable=0;variable<4;variable++)
  243. {
  244. final_ans[number] = dec_num[variable]-48;
  245. number++;
  246. }
  247. dec_num= answer_in_4_bits[3];
  248. for(int variable=0;variable<4;variable++)
  249. {
  250. final_ans[number] = dec_num[variable]-48;
  251. number++;
  252. }
  253. for(i=0;i<16;i++)
  254. multiplication_ans[i]=final_ans[i];
  255. return final_ans;
  256. }
  257. int concatenate(int x, int y) {
  258. unsigned pow = 10;
  259. while(y >= pow)
  260. pow *= 10;
  261. return x * pow + y;
  262. }
  263. int binary_to_decimal(int num)
  264. {
  265. int rem,base=1,dec=0;
  266. while (num > 0)
  267. {
  268. rem = num % 10;
  269. dec = dec + rem * base;
  270. base = base * 2;
  271. num = num / 10;
  272. }
  273. return dec;
  274. }
  275. int * rot_nib(int num)
  276. {
  277. int i,temp,temp_array[8]={0},final=0;
  278. for(i=0;i<8;i++)
  279. {
  280. temp_array[7-i] = num % 10;
  281. num = num/10;
  282. }
  283. for(i=0;i<4;i++)
  284. {
  285. temp=temp_array[i];
  286. temp_array[i]=temp_array[i+4];
  287. temp_array[i+4]=temp;
  288. }
  289. for(i=0;i<8;i++) {
  290. final=final*10+temp_array[i];
  291. }
  292. return temp_array;
  293. }
  294. int * add_round_key(int plain_text[16],int key[16])
  295. {
  296. int plain_text_in_integer_form=0,plain_text_in_integer_form_first_8_bits=0,plain_text_in_integer_form_next_8_bits=0,nibbles[16],temp_array[16],i,temp_num;
  297. for(i=0;i<16;i++)
  298. plain_text_in_integer_form=10*plain_text_in_integer_form+plain_text[i];
  299. for(i=0;i<16;i++)
  300. plain_text[i]=plain_text[i]^key[i];
  301. for(i=0;i<4;i++)
  302. {
  303. add_round_key_array[i]= nibbles[i]=plain_text[i];
  304. add_round_key_array[i+4]=nibbles[i+4]=plain_text[i+4];
  305. add_round_key_array[i+8]=nibbles[i+8]=plain_text[i+8];
  306. add_round_key_array[i+12]=nibbles[i+12]=plain_text[i+12];
  307. }
  308. return nibbles;
  309. }
  310. int * shift_rows(int nibbles[])
  311. {
  312. int temp;
  313. for(int i=4;i<8;i++)
  314. {
  315. temp=nibbles[i];
  316. nibbles[i]=nibbles[i+8];
  317. nibbles[i+8]=temp;
  318. }
  319. return nibbles;
  320. }
  321. int * sub_nib(int num,string sbox[4][4])
  322. {
  323. int i,temp_array[8],final;
  324. string temp,temp1;
  325. for(i=0;i<8;i++)
  326. {
  327. temp_array[7-i] = num % 10;
  328. num /= 10;
  329. }
  330. temp=sbox[binary_to_int[temp_array[0]][temp_array[1]]][binary_to_int[temp_array[2]][temp_array[3]]];
  331. temp1=sbox[binary_to_int[temp_array[4]][temp_array[5]]][binary_to_int[temp_array[6]][temp_array[7]]];
  332. final = stoi(temp+temp1);
  333. for(i=0;i<8;i++)
  334. {
  335. temp_array[7-i] = final % 10;
  336. final /= 10;
  337. }
  338. return temp_array;
  339. }
  340. int * sub_nib_for_16_bits(int temp_array[16],string sbox[4][4])
  341. {
  342. int i,final;
  343. string temp,temp1,temp2,temp3;
  344. temp=sbox[binary_to_int[temp_array[0]][temp_array[1]]][binary_to_int[temp_array[2]][temp_array[3]]];
  345. temp1=sbox[binary_to_int[temp_array[4]][temp_array[5]]][binary_to_int[temp_array[6]][temp_array[7]]];
  346. temp2=sbox[binary_to_int[temp_array[8]][temp_array[9]]][binary_to_int[temp_array[10]][temp_array[11]]];
  347. temp3=sbox[binary_to_int[temp_array[12]][temp_array[13]]][binary_to_int[temp_array[14]][temp_array[15]]];
  348. for(i=0;i<4;i++)
  349. {
  350. temp_array[i] = temp[i]-48;
  351. temp_array[i+4] = temp1[i]-48;
  352. temp_array[i+8] = temp2[i]-48;
  353. temp_array[i+12] =temp3[i]-48;
  354. }
  355. return temp_array;
  356. }
  357. int main()
  358. {
  359. int C0[8]={1,0,0,0,0,0,0,0},C1[8]={0,0,1,1,0,0,0,0},i,key[16],temp[8],W[6][8]={0},N=2,count=0,key0[16],key1[16],key2[16],plain_text[16],*ptr,nibbles[16],temp_num,temp_num1,*temporary,*another_temp;
  360. string sbox[4][4]={"1001","0100","1010","1011","1101","0001","1000","0101","0110","0010","0000","0011","1100","1110","1111","0111"};
  361. cout<<"\nEnter the key\n";
  362. for(i=0;i<16;i++)
  363. cin>>key[i];
  364. cout<<"\nEnter the plain text\n";
  365. for(i=0;i<16;i++)
  366. cin>>plain_text[i];
  367. for(i=0;i<8;i++)
  368. {
  369. W[0][i]=key[i];
  370. W[1][i]=key[i+8];
  371. }
  372. for(count=0;count<6;count++)
  373. if(N%2==0)
  374. {
  375. temp_num=0;
  376. for(i=0;i<8;i++)
  377. temp_num=temp_num*10+W[N-1][i];
  378. another_temp= rot_nib(temp_num);
  379. temp_num=0;
  380. for(i=0;i<8;i++)
  381. temp_num=temp_num*10+(*(another_temp+i));
  382. temporary= sub_nib(temp_num,sbox);
  383. for(i=0;i<8;i++)
  384. temp[i]=W[N-2][i] ^ (*(temporary+i));
  385. if(count==0)
  386. for(i=0;i<8;i++)
  387. W[N][i]=temp[i]^C0[i];
  388. else
  389. for(i=0;i<8;i++)
  390. W[N][i]=temp[i]^C1[i];
  391. N++;
  392. }
  393. else
  394. {
  395. for(i=0;i<8;i++)
  396. W[N][i]=W[N-2][i]^W[N-1][i];
  397. N++;
  398. }
  399. for(i=0;i<8;i++)
  400. {
  401. key0[i]=W[0][i];
  402. key0[8+i]=W[1][i];
  403. key1[i]=W[2][i];
  404. key1[8+i]=W[3][i];
  405. key2[i]=W[4][i];
  406. key2[8+i]=W[5][i];
  407. }
  408. ptr= add_round_key(plain_text,key0);
  409. for(i=0;i<16;i++)
  410. nibbles[i]=*(ptr+i);
  411. ptr=sub_nib_for_16_bits(nibbles,sbox);
  412. for(i=0;i<16;i++)
  413. {
  414. nibbles[i]=*(ptr+i);
  415. }
  416. temporary=shift_rows(nibbles);
  417. for(i=0;i<16;i++)
  418. {
  419. nibbles[i]=*(temporary+i);
  420. }
  421. int nibbles_in_four_bit_form[4]={0};
  422. for(i=0;i<4;i++)
  423. {
  424. nibbles_in_four_bit_form[0]=nibbles_in_four_bit_form[0]*10+nibbles[i];
  425. nibbles_in_four_bit_form[1]=nibbles_in_four_bit_form[1]*10+nibbles[i+4];
  426. nibbles_in_four_bit_form[2]=nibbles_in_four_bit_form[2]*10+nibbles[i+8];
  427. nibbles_in_four_bit_form[3]=nibbles_in_four_bit_form[3]*10+nibbles[i+12];
  428. }
  429. int mul_factor_matrix[2][2]={1,4,4,1};
  430. ptr= perform_multiplication(nibbles_in_four_bit_form,mul_factor_matrix,6);
  431. for(i=0;i<16;i++)
  432. plain_text[i]=*(ptr+i);
  433. ptr= add_round_key(plain_text,key1);
  434. for(i=0;i<16;i++)
  435. nibbles[i]=*(ptr+i);
  436. ptr=sub_nib_for_16_bits(nibbles,sbox);
  437. for(i=0;i<16;i++)
  438. {
  439. nibbles[i]=*(ptr+i);
  440. }
  441. temporary=shift_rows(nibbles);
  442. for(i=0;i<16;i++)
  443. {
  444. nibbles[i]=*(temporary+i);
  445. }
  446. ptr= add_round_key(nibbles,key2);
  447. for(i=0;i<16;i++)
  448. nibbles[i]=*(ptr+i);
  449. cout<<"Cipher Text is "<<endl;
  450. for(i=0;i<16;i++)
  451. cout<<nibbles[i];
  452. cout<<endl;
  453. // --------------- DECRYPTION STARTS HERE-------------
  454. int * pointer;
  455. pointer= add_round_key(nibbles,key2);
  456. for(i=0;i<16;i++)
  457. {
  458. nibbles[i]=*(pointer+i);
  459. }
  460. temporary=shift_rows(add_round_key_array);
  461. for(i=0;i<16;i++)
  462. {
  463. nibbles[i]=*(temporary+i);
  464. }
  465. ptr=sub_nib_for_16_bits(nibbles,decryption_sbox);
  466. for(i=0;i<16;i++)
  467. {
  468. nibbles[i]=*(ptr+i);
  469. }
  470. pointer= add_round_key(nibbles,key1);
  471. for(i=0;i<16;i++)
  472. {
  473. nibbles[i]=*(pointer+i);
  474. }
  475. int mul_factor_matrix_for_decryption[2][2]={9,2,2,9};
  476. nibbles_in_four_bit_form[0]=nibbles_in_four_bit_form[1]=nibbles_in_four_bit_form[2]=nibbles_in_four_bit_form[3]=0;
  477. for(i=0;i<4;i++)
  478. {
  479. nibbles_in_four_bit_form[0]=nibbles_in_four_bit_form[0]*10+add_round_key_array[i];
  480. nibbles_in_four_bit_form[1]=nibbles_in_four_bit_form[1]*10+add_round_key_array[i+4];
  481. nibbles_in_four_bit_form[2]=nibbles_in_four_bit_form[2]*10+add_round_key_array[i+8];
  482. nibbles_in_four_bit_form[3]=nibbles_in_four_bit_form[3]*10+add_round_key_array[i+12];
  483. }
  484. ptr= perform_multiplication(nibbles_in_four_bit_form,mul_factor_matrix_for_decryption,7);
  485. for(i=0;i<16;i++)
  486. {
  487. nibbles[i]=*(ptr+i);
  488. }
  489. temporary=shift_rows(multiplication_ans);
  490. for(i=0;i<16;i++)
  491. {
  492. nibbles[i]=*(temporary+i);
  493. }
  494. ptr=sub_nib_for_16_bits(nibbles,decryption_sbox);
  495. for(i=0;i<16;i++)
  496. {
  497. nibbles[i]=*(ptr+i);
  498. }
  499. pointer= add_round_key(nibbles,key0);
  500. cout<<"Decrypted Text is"<<endl;
  501. for(i=0;i<16;i++)
  502. {
  503. nibbles[i]=*(pointer+i);
  504. cout<<add_round_key_array[i];
  505. }
  506. cout<<endl;
  507. return 0;
  508. }
  509. /*
  510. OUTPUT:-
  511. Enter the key
  512. 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1
  513. Enter the plain text
  514. 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0
  515. Cipher Text is
  516. 0010010011101100
  517. Decrypted Text is
  518. 1101011100101000
  519. */