fork download
  1.  
  2. #include <iostream>
  3.  
  4.  
  5. struct block
  6. {
  7. public:
  8. unsigned long long SED(unsigned long long input, unsigned long long key)
  9. {
  10. bool A[64];
  11. bool Key[64];
  12. std::cout << "SED: " << input << "\t" << key << std::endl;
  13. for (int i = 0; i<64; ++i)
  14. {
  15. A[i] = input & 1;
  16. Key[i] = key & 1;
  17. input >>= 1;
  18. key >>= 1;
  19. std::cout << A[i];
  20. }
  21. std::cout << std::endl;
  22. C0(Key);
  23. D0(Key);
  24. IP_1(A);
  25. bool L[32];
  26. bool R[32];
  27. for (int i = 0; i<32; ++i)
  28. {
  29. L[i] = data[i + 32];
  30. R[i] = data[i];
  31. }
  32. for (int j = 0; j< 16; ++j)
  33. {
  34. bool k_[56];
  35. for (int i = 0; i<28; ++i)
  36. {
  37. k_[i] = c[i];
  38. k_[i + 28] = d[i];
  39. }
  40. K(j, k_);
  41. CiDi(j + 1);
  42. }
  43. for (int j = 16; j>0; --j)
  44. {
  45. f(j, L);
  46. for (int i = 0; i<32; ++i)
  47. {
  48. R[i] = L[i];
  49. L[i] = R[i] xor p[i];
  50. }
  51. }
  52. bool T[64];
  53. for (int i = 0; i<32; ++i)
  54. {
  55. T[i + 32] = L[i];
  56. T[i] = R[i];
  57. }
  58. IP_1(T);
  59. unsigned long long res = 0;
  60. for (int i = 0; i<64; ++i)
  61. {
  62. std::cout << data[i];
  63. res = res + data[i];
  64. res *= 2;
  65. }
  66. std::cout << std::endl;
  67. return res;
  68. }
  69. unsigned long long DES(unsigned long long input, unsigned long long key)
  70. {
  71. bool A[64];
  72. bool Key[64];
  73. std::cout << "DES: " << input << "\t" << key << std::endl;
  74. for (int i = 0; i<64; ++i)
  75. {
  76. A[i] = input & 1;
  77. Key[i] = key & 1;
  78. input >>= 1;
  79. key >>= 1;
  80. std::cout << A[i];
  81. }
  82. std::cout << std::endl;
  83. IP(A);
  84. C0(Key);
  85. D0(Key);
  86. bool L[32];
  87. bool R[32];
  88. for (int i = 0; i<32; ++i)
  89. {
  90. L[i] = data[i + 32];
  91. R[i] = data[i];
  92. }
  93. for (int j = 0; j<16; ++j)
  94. {
  95. bool k_[56];
  96. for (int i = 0; i<28; ++i)
  97. {
  98. k_[i] = c[i];
  99. k_[i + 28] = d[i];
  100. }
  101. K(j, k_);
  102. f(j, L);
  103. for (int i = 0; i<32; ++i)
  104. {
  105. L[i] = R[i];
  106. R[i] = L[i] xor p[i];
  107. }
  108. CiDi(j + 1);
  109. }
  110. for (int i = 0; i<32; ++i)
  111. {
  112. A[i + 32] = L[i];
  113. A[i] = R[i];
  114. }
  115. IP_1(A);
  116. unsigned long long res = 0;
  117. for (int i = 63; i >= 0; --i)
  118. {
  119. res = res + data[i];
  120. res *= 2;
  121. }
  122. for (int i = 0; i<64 ; ++i) std::cout << data[i];
  123. std::cout << std::endl;
  124. return res;
  125. }
  126.  
  127. private:
  128. bool data[64];
  129. bool p[32];
  130. bool e[48];
  131. bool c[28];
  132. bool d[28];
  133. bool k[16][48];
  134. int s[8];
  135. void f(int i, bool L[32])
  136. {
  137. E(L);
  138. bool step1[48];
  139. for (int j = 0; j<48; ++j) step1[j] = e[j] xor k[i][j];
  140. setS(step1);
  141. bool b[32];
  142. for (int j = 0; j<8; ++j)
  143. {
  144. int st = s[j];
  145. for (int i = j * 4; i<(j + 1) * 4; ++i)
  146. {
  147. b[i] = st & 1;
  148. st >>= 1;
  149. }
  150. }
  151. P(b);
  152. }
  153. void setS(bool mas[48])
  154. {
  155. int res = 0, j = 0;
  156. for (int i = 0; i<48; ++i)
  157. {
  158. res <<= 1;
  159. res += mas[i];
  160. if (i % 6 == 5)
  161. {
  162. s[j] = S[j][res];
  163. res = 0;
  164. ++j;
  165. }
  166. }
  167. }
  168. void K(int i, bool R[56])
  169. {
  170. k[i][0] = R[14];
  171. k[i][1] = R[17];
  172. k[i][2] = R[11];
  173. k[i][3] = R[24];
  174. k[i][4] = R[1];
  175. k[i][5] = R[5];
  176. k[i][6] = R[3];
  177. k[i][7] = R[28];
  178. k[i][8] = R[15];
  179. k[i][9] = R[6];
  180. k[i][10] = R[21];
  181. k[i][11] = R[10];
  182. k[i][12] = R[23];
  183. k[i][13] = R[19];
  184. k[i][14] = R[12];
  185. k[i][15] = R[4];
  186. k[i][16] = R[26];
  187. k[i][17] = R[8];
  188. k[i][18] = R[16];
  189. k[i][19] = R[7];
  190. k[i][20] = R[27];
  191. k[i][21] = R[20];
  192. k[i][22] = R[13];
  193. k[i][23] = R[2];
  194. k[i][24] = R[41];
  195. k[i][25] = R[52];
  196. k[i][26] = R[31];
  197. k[i][27] = R[37];
  198. k[i][28] = R[47];
  199. k[i][29] = R[55];
  200. k[i][30] = R[30];
  201. k[i][31] = R[40];
  202. k[i][32] = R[51];
  203. k[i][33] = R[45];
  204. k[i][34] = R[33];
  205. k[i][35] = R[48];
  206. k[i][36] = R[44];
  207. k[i][37] = R[49];
  208. k[i][38] = R[39];
  209. k[i][39] = R[56];
  210. k[i][40] = R[34];
  211. k[i][41] = R[53];
  212. k[i][42] = R[46];
  213. k[i][43] = R[42];
  214. k[i][44] = R[50];
  215. k[i][45] = R[36];
  216. k[i][46] = R[29];
  217. k[i][47] = R[32];
  218. }
  219. void CiDi(int i)
  220. {
  221. int n = 0;
  222. switch (i)
  223. {
  224. case 1: n = 1; break;
  225. case 2: n = 1; break;
  226. case 3: n = 2; break;
  227. case 4: n = 2; break;
  228. case 5: n = 2; break;
  229. case 6: n = 2; break;
  230. case 7: n = 2; break;
  231. case 8: n = 2; break;
  232. case 9: n = 1; break;
  233. case 10: n = 2; break;
  234. case 11: n = 2; break;
  235. case 12: n = 2; break;
  236. case 13: n = 2; break;
  237. case 14: n = 2; break;
  238. case 15: n = 2; break;
  239. case 16: n = 1; break;
  240. default: std::cout << "error, i=" << i;
  241. }
  242. bool tc0 = c[0];
  243. bool tc1 = c[1];
  244. bool td0 = d[0];
  245. bool td1 = d[1];
  246. for (int i = 0; i<28 - n; ++i)
  247. {
  248. c[i] = c[i + n];
  249. d[i] = d[i + n];
  250. }
  251. c[27] = tc0;
  252. d[27] = td0;
  253. if (n == 2) { c[26] = tc1; d[26] = td1; }
  254. }
  255. void D0(const bool R[64])
  256. {
  257. d[0] = R[63];
  258. d[1] = R[55];
  259. d[2] = R[47];
  260. d[3] = R[39];
  261. d[4] = R[31];
  262. d[5] = R[23];
  263. d[6] = R[15];
  264. d[7] = R[7];
  265. d[8] = R[62];
  266. d[9] = R[54];
  267. d[10] = R[46];
  268. d[11] = R[38];
  269. d[12] = R[30];
  270. d[13] = R[22];
  271. d[14] = R[14];
  272. d[15] = R[6];
  273. d[16] = R[61];
  274. d[17] = R[53];
  275. d[18] = R[45];
  276. d[19] = R[37];
  277. d[20] = R[29];
  278. d[21] = R[21];
  279. d[22] = R[13];
  280. d[23] = R[5];
  281. d[24] = R[28];
  282. d[25] = R[20];
  283. d[26] = R[12];
  284. d[27] = R[4];
  285. }
  286. void C0(const bool R[64])
  287. {
  288. c[0] = R[57];
  289. c[1] = R[49];
  290. c[2] = R[41];
  291. c[3] = R[33];
  292. c[4] = R[25];
  293. c[5] = R[17];
  294. c[6] = R[9];
  295. c[7] = R[1];
  296. c[8] = R[58];
  297. c[9] = R[50];
  298. c[10] = R[42];
  299. c[11] = R[34];
  300. c[12] = R[26];
  301. c[13] = R[18];
  302. c[14] = R[10];
  303. c[15] = R[2];
  304. c[16] = R[59];
  305. c[17] = R[51];
  306. c[18] = R[43];
  307. c[19] = R[35];
  308. c[20] = R[27];
  309. c[21] = R[19];
  310. c[22] = R[11];
  311. c[23] = R[3];
  312. c[24] = R[60];
  313. c[25] = R[52];
  314. c[26] = R[44];
  315. c[27] = R[36];
  316. }
  317.  
  318. const int S[8][64] = {
  319. { 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
  320. 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13 },
  321. { 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
  322. 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9 },
  323. { 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
  324. 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12 },
  325. { 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
  326. 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14 },
  327. { 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
  328. 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3 },
  329. { 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
  330. 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13 },
  331. { 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
  332. 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12 },
  333. { 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
  334. 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 }
  335. };
  336. void P(bool R[32])
  337. {
  338. p[0] = R[16];
  339. p[1] = R[7];
  340. p[2] = R[20];
  341. p[3] = R[21];
  342. p[4] = R[29];
  343. p[5] = R[12];
  344. p[6] = R[28];
  345. p[7] = R[17];
  346. p[8] = R[1];
  347. p[9] = R[15];
  348. p[10] = R[23];
  349. p[11] = R[26];
  350. p[12] = R[5];
  351. p[13] = R[18];
  352. p[14] = R[31];
  353. p[15] = R[10];
  354. p[16] = R[2];
  355. p[17] = R[8];
  356. p[18] = R[24];
  357. p[19] = R[14];
  358. p[20] = R[0];
  359. p[21] = R[27];
  360. p[22] = R[3];
  361. p[23] = R[9];
  362. p[24] = R[19];
  363. p[25] = R[13];
  364. p[26] = R[30];
  365. p[27] = R[6];
  366. p[28] = R[22];
  367. p[29] = R[11];
  368. p[30] = R[4];
  369. p[31] = R[25];
  370. }
  371. void E(bool R[32])
  372. {
  373. e[0] = R[0];
  374. e[1] = R[1];
  375. e[2] = R[2];
  376. e[3] = R[3];
  377. e[4] = R[4];
  378. e[5] = R[5];
  379. e[6] = R[4];
  380. e[7] = R[5];
  381. e[8] = R[6];
  382. e[9] = R[7];
  383. e[10] = R[8];
  384. e[11] = R[9];
  385. e[12] = R[8];
  386. e[13] = R[9];
  387. e[14] = R[10];
  388. e[15] = R[11];
  389. e[16] = R[12];
  390. e[17] = R[13];
  391. e[18] = R[12];
  392. e[19] = R[13];
  393. e[20] = R[14];
  394. e[21] = R[15];
  395. e[22] = R[16];
  396. e[23] = R[17];
  397. e[24] = R[16];
  398. e[25] = R[17];
  399. e[26] = R[18];
  400. e[27] = R[19];
  401. e[28] = R[20];
  402. e[29] = R[21];
  403. e[30] = R[20];
  404. e[31] = R[21];
  405. e[32] = R[22];
  406. e[33] = R[23];
  407. e[34] = R[24];
  408. e[35] = R[25];
  409. e[36] = R[24];
  410. e[37] = R[25];
  411. e[38] = R[26];
  412. e[39] = R[27];
  413. e[40] = R[28];
  414. e[41] = R[29];
  415. e[42] = R[28];
  416. e[43] = R[29];
  417. e[44] = R[30];
  418. e[45] = R[31];
  419. e[46] = R[0];
  420. e[47] = R[1];
  421. }
  422.  
  423. void IP(const bool A[64])
  424. {
  425. data[0] = A[58];
  426. data[1] = A[50];
  427. data[2] = A[42];
  428. data[3] = A[34];
  429. data[4] = A[26];
  430. data[5] = A[18];
  431. data[6] = A[10];
  432. data[7] = A[2];
  433. data[8] = A[60];
  434. data[9] = A[52];
  435. data[10] = A[44];
  436. data[11] = A[36];
  437. data[12] = A[28];
  438. data[13] = A[20];
  439. data[14] = A[12];
  440. data[15] = A[4];
  441. //
  442. data[16] = A[62];
  443. data[17] = A[54];
  444. data[18] = A[46];
  445. data[19] = A[38];
  446. data[20] = A[30];
  447. data[21] = A[22];
  448. data[22] = A[14];
  449. data[23] = A[6];
  450. data[24] = A[64];
  451. data[25] = A[56];
  452. data[26] = A[48];
  453. data[27] = A[40];
  454. data[28] = A[32];
  455. data[29] = A[24];
  456. data[30] = A[16];
  457. data[31] = A[8];
  458. //
  459. data[32] = A[57];
  460. data[33] = A[49];
  461. data[34] = A[41];
  462. data[35] = A[33];
  463. data[36] = A[25];
  464. data[37] = A[17];
  465. data[38] = A[9];
  466. data[39] = A[1];
  467. data[40] = A[59];
  468. data[41] = A[51];
  469. data[42] = A[43];
  470. data[43] = A[35];
  471. data[44] = A[27];
  472. data[45] = A[19];
  473. data[46] = A[11];
  474. data[47] = A[3];
  475. //
  476. data[48] = A[61];
  477. data[49] = A[53];
  478. data[50] = A[45];
  479. data[51] = A[37];
  480. data[52] = A[29];
  481. data[53] = A[21];
  482. data[54] = A[13];
  483. data[55] = A[5];
  484. data[56] = A[63];
  485. data[57] = A[55];
  486. data[58] = A[47];
  487. data[59] = A[39];
  488. data[60] = A[31];
  489. data[61] = A[23];
  490. data[62] = A[15];
  491. data[63] = A[7];
  492. }
  493. void IP_1(const bool A[64])
  494. {
  495. data[0] = A[40];
  496. data[1] = A[8];
  497. data[2] = A[48];
  498. data[3] = A[16];
  499. data[4] = A[56];
  500. data[5] = A[24];
  501. data[6] = A[0];
  502. data[7] = A[32];
  503. data[8] = A[39];
  504. data[9] = A[7];
  505. data[10] = A[47];
  506. data[11] = A[15];
  507. data[12] = A[55];
  508. data[13] = A[23];
  509. data[14] = A[63];
  510. data[15] = A[31];
  511. //
  512. data[16] = A[38];
  513. data[17] = A[6];
  514. data[18] = A[46];
  515. data[19] = A[14];
  516. data[20] = A[54];
  517. data[21] = A[22];
  518. data[22] = A[62];
  519. data[23] = A[30];
  520. data[24] = A[37];
  521. data[25] = A[5];
  522. data[26] = A[45];
  523. data[27] = A[13];
  524. data[28] = A[53];
  525. data[29] = A[21];
  526. data[30] = A[61];
  527. data[31] = A[29];
  528. //
  529. data[32] = A[36];
  530. data[33] = A[4];
  531. data[34] = A[44];
  532. data[35] = A[12];
  533. data[36] = A[52];
  534. data[37] = A[20];
  535. data[38] = A[60];
  536. data[39] = A[28];
  537. data[40] = A[35];
  538. data[41] = A[3];
  539. data[42] = A[43];
  540. data[43] = A[11];
  541. data[44] = A[51];
  542. data[45] = A[19];
  543. data[46] = A[59];
  544. data[47] = A[27];
  545. //
  546. data[48] = A[34];
  547. data[49] = A[2];
  548. data[50] = A[42];
  549. data[51] = A[10];
  550. data[52] = A[50];
  551. data[53] = A[18];
  552. data[54] = A[58];
  553. data[55] = A[26];
  554. data[56] = A[33];
  555. data[57] = A[1];
  556. data[58] = A[41];
  557. data[59] = A[9];
  558. data[60] = A[49];
  559. data[61] = A[17];
  560. data[62] = A[57];
  561. data[63] = A[25];
  562. }
  563. };
  564.  
  565. int main()
  566. {
  567. block p;
  568. unsigned long long int a = p.DES(123456789, 123);
  569. unsigned long long int b = p.SED(a, 123);
  570. std::cout << "Hello World! a=" << a << "; b=" << b << std::endl;
  571. return 0;
  572. }
  573.  
  574.  
Success #stdin #stdout 0s 3152KB
stdin
Standard input is empty
stdout
DES: 123456789	123
1010100010110011110110101110000000000000000000000000000000000000
0111100010100011101101001010010010100111001110111000111101011000
SED: 3883151582205545020	123
0011110001010001110110100101001001010011100111011100011110101100
1101000000110101111010011000001101000011010101110001011011000100
Hello World! a=3883151582205545020; b=11559564893559336328