Advertisement
DilyaraL

Криптон

May 19th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.03 KB | None | 0 0
  1. const int N = 4;
  2. const int M = 3;
  3. int Q[8] = { 40, 134 ,20 , 97 , 148 , 65 , 41 , 130 };
  4. int B[16] = { 0x63, 0x7c, 0x77, 0x7b , 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 };
  5. int KEY[32] = { 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
  6. 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 };
  7. int P0(int x)
  8. {
  9. switch (x)
  10. {
  11. case 0x0: return 0xf; break;
  12. case 0x1: return 0xe; break;
  13. case 0x2: return 0xa; break;
  14. case 0x3: return 0x1; break;
  15. case 0x4: return 0xb; break;
  16. case 0x5: return 0x5; break;
  17. case 0x6: return 0x8; break;
  18. case 0x7: return 0xd; break;
  19. case 0x8: return 0x9; break;
  20. case 0x9: return 0x3; break;
  21. case 0xa: return 0x2; break;
  22. case 0xb: return 0x7; break;
  23. case 0xc: return 0x0; break;
  24. case 0xd: return 0x6; break;
  25. case 0xe: return 0x4; break;
  26. case 0xf: return 0xc; break;
  27. }
  28. }
  29.  
  30. int P1(int x)
  31. {
  32. switch (x)
  33. {
  34. case 0x0: return 0xb; break;
  35. case 0x1: return 0xa; break;
  36. case 0x2: return 0xd; break;
  37. case 0x3: return 0x7; break;
  38. case 0x4: return 0x8; break;
  39. case 0x5: return 0xe; break;
  40. case 0x6: return 0x0; break;
  41. case 0x7: return 0x5; break;
  42. case 0x8: return 0xf; break;
  43. case 0x9: return 0x6; break;
  44. case 0xa: return 0x3; break;
  45. case 0xb: return 0x4; break;
  46. case 0xc: return 0x1; break;
  47. case 0xd: return 0x9; break;
  48. case 0xe: return 0x2; break;
  49. case 0xf: return 0xc; break;
  50. }
  51. }
  52.  
  53. int P0_1(int x)
  54. {
  55. switch (x)
  56. {
  57. case 0x0: return 0xc; break;
  58. case 0x1: return 0x3; break;
  59. case 0x2: return 0xa; break;
  60. case 0x3: return 0x9; break;
  61. case 0x4: return 0xe; break;
  62. case 0x5: return 0x5; break;
  63. case 0x6: return 0xd; break;
  64. case 0x7: return 0xb; break;
  65. case 0x8: return 0x6; break;
  66. case 0x9: return 0x8; break;
  67. case 0xa: return 0x2; break;
  68. case 0xb: return 0x4; break;
  69. case 0xc: return 0xf; break;
  70. case 0xd: return 0x7; break;
  71. case 0xe: return 0x1; break;
  72. case 0xf: return 0x0; break;
  73. }
  74. }
  75.  
  76. int P1_1(int x)
  77. {
  78. switch (x)
  79. {
  80. case 0x0: return 0x6; break;
  81. case 0x1: return 0xc; break;
  82. case 0x2: return 0xe; break;
  83. case 0x3: return 0xa; break;
  84. case 0x4: return 0xb; break;
  85. case 0x5: return 0x7; break;
  86. case 0x6: return 0x9; break;
  87. case 0x7: return 0x3; break;
  88. case 0x8: return 0x4; break;
  89. case 0x9: return 0xd; break;
  90. case 0xa: return 0x1; break;
  91. case 0xb: return 0x0; break;
  92. case 0xc: return 0xf; break;
  93. case 0xd: return 0x2; break;
  94. case 0xe: return 0x5; break;
  95. case 0xf: return 0x8; break;
  96. }
  97. }
  98.  
  99. int rol_m(int Y, int m)
  100. {
  101. return ((Y << m) & 255 | ((Y << m) / 256));
  102. }
  103.  
  104. int one_zero(int h)///количество единиц четно или нет в двоичной записи числа
  105. {
  106. int k=0, power = 128;
  107. for (int i = 0; i < 8&&(h!=0); i++)
  108. {
  109. if (h - power >= 0)
  110. {
  111. h -=power;
  112. k++;
  113. }
  114. power /= 2;
  115. }
  116. if (k % 2 == 0)
  117. return 0;
  118. else return 1;
  119. }
  120.  
  121. int S(int x)
  122. {
  123. int z = P1(x/16)*16 +P0(x%16);
  124. int w = 0, power = 128;
  125. for (int i = 0; i < 2 * N; i++)
  126. {
  127. w += (one_zero((z& Q[i])))*power;
  128. power /= 2;
  129. }
  130. int y = P1_1(w / 16) * 16 + P0_1(w % 16);
  131. return y;
  132. }
  133.  
  134. int** Y(int n, int** a)//один элемент а="f0"
  135. {
  136. int** b = new int*[N];
  137. for (int i = 0; i < N; i++)
  138. b[i] = new int[N];
  139.  
  140. for (int i = 0; i < N; i++)
  141. for (int j = 0; j < N; j++)
  142. {
  143. switch ((i + j + 2 * n) % 4)
  144. {
  145. case 0: b[i][j] = rol_m(S(a[i][j]), 1);break;
  146. case 1: b[i][j] = rol_m(S(a[i][j]), 3);break;
  147. case 2: b[i][j] = S(rol_m(a[i][j], 7));break;
  148. case 3: b[i][j] = S(rol_m(a[i][j], 5));break;
  149. }
  150. }
  151. return b;
  152. }
  153.  
  154. int** Pi(int**a, int n)
  155. {
  156. int m[4]= { 0xfc,0xf3,0xcf,0x3f };
  157.  
  158. int** b = new int*[N];
  159. for (int i = 0; i < N; i++)
  160. b[i] = new int[N];
  161.  
  162. for (int i = 0; i < N; i++)
  163. for (int j = 0; j < N; j++)
  164. b[i][j] = 0;
  165.  
  166. for (int i = 0; i < N; i++)
  167. for (int j = 0; j < N; j++)
  168. for (int k = 0; k < N; k++)
  169. b[i][j] ^= (m[(i - j + 3 + k + 2 * n) % 4] &a[k][j]);
  170. return b;
  171. }
  172.  
  173. void T(int** A)//транспoнируем
  174. {
  175. int x;
  176. for (int i = 0; i < N; i++)
  177. for (int j = 0; j < i; j++)
  178. {
  179. x = A[i][j];
  180. A[i][j] = A[j][i];
  181. A[j][i] = x;
  182. }
  183. }
  184.  
  185. int rol_n(unsigned int X, int n)
  186. {
  187. return ((X << n) & 4294967295 | ((X << n) / 4294967296));
  188. }
  189.  
  190. int rolb_n(unsigned int X, int n)
  191. {
  192. int Y = 0; int power = 16777216;
  193. for (int i = 0; i < N; i++)
  194. {
  195. Y += rol_m(X/power, n)*power;
  196. X %= power;
  197. power /= 256;
  198.  
  199. }
  200.  
  201. return Y;
  202. }
  203.  
  204. int*** key(int* K)
  205. {
  206. int** H = new int*[N];
  207. for (int i = 0; i < N; i++)
  208. H[i] = new int[N];
  209.  
  210. unsigned int* U = new unsigned int[N];
  211.  
  212. for (int i = 0; i < N; i++)
  213. for (int j = 0; j < N; j++)
  214. H[i][j] = K[i*N + j];
  215. H = Pi(Y(0, H), 0);
  216. T(H);
  217. for (int i = 0; i < N; i++)
  218. U[i] = 0;
  219. unsigned int power = 16777216;//16^6
  220. for (int i = 0; i < N; i++)
  221. for (int j = 0; j < N; j++)
  222. {
  223. U[i] += (H[i][j])*power;
  224. power /= 256;
  225. }
  226.  
  227. unsigned int * V = new unsigned int[N];
  228. int l = 1;
  229. for (int i = 0; i < N; i++)
  230. for (int j = N - 1; j >= 0; j--)
  231. {
  232. H[i][j] = K[l];
  233. l += 2;
  234. }
  235. H = Pi(Y(1, H), 1);
  236. T(H);
  237. for (int i = 0; i < N; i++)
  238. V[i] = 0;
  239. power = 16777216;//16^6
  240. for (int i = 0; i < N; i++)
  241. for (int j = 0; j < N; j++)
  242. {
  243. V[i] += (H[i][j])*power;
  244. power /= 256;
  245. }
  246.  
  247. unsigned int * e = new unsigned int[8];
  248.  
  249. for (int i = 0; i < N; i++)
  250. {
  251. e[i]= U[i]^V[0]^V[1]^V[2]^V[3];
  252. e[i + 4]= V[i]^U[0]^U[1]^U[2]^U[3];
  253. }
  254.  
  255. unsigned int * c = new unsigned int[13];
  256. c[0] = 0xa54ff53a;
  257. for (int i = 1; i < 13; i++)
  258. c[i] = (c[i - 1] + 0x3c6ef372) % 4294967296;
  259.  
  260. unsigned int * mc = new unsigned int[N];
  261. mc[0] = 0xacacacac;
  262.  
  263. for (int i = 1; i < N; i++)
  264. mc[i] = rolb_n(mc[i - 1], 1);
  265.  
  266. int ***ke = new int**[13];
  267. for (int i = 0; i < 13; i++)
  268. {
  269. ke[i] = new int*[N];
  270. for (int j = 0; j < N; j++)
  271. ke[i][j] = new int[N];
  272. }
  273.  
  274. unsigned int o0,o1, p0,p1 , t;
  275. for (int i = 0; i < N; i++)
  276. {
  277. power = 16777216;
  278. p0 = e[i];
  279. p1 = e[i + 4];
  280. t = mc[i];
  281. o0 = c[0];
  282. o1 = c[1];
  283. for (int j = 0; j < N; j++)
  284. {
  285. ke[0][i][j] = (p0 / power) ^ (o0 / power) ^ (t / power);
  286. ke[1][i][j] = (p1 / power) ^ (o1 / power) ^ (t / power);
  287. p0%=power;
  288. p1%=power;
  289. t %=power;
  290. o0%=power;
  291. o1%=power;
  292. power /= 256;
  293. }
  294. }
  295.  
  296. for (int r = 2; r < 13; r++)
  297. {
  298. if (r % 2 == 1)
  299. {
  300. e[4] = rolb_n(e[7], 2);
  301. e[5] = rolb_n(e[4], 2);
  302. e[6] = rol_n(e[5], 8);
  303. e[7] = rol_n(e[6], 16);
  304. for (int i = 0; i < N; i++)
  305. {
  306. power = 16777216;
  307. p0 = e[i + 4];
  308. t = mc[i];
  309. o0 = c[r];
  310. for (int j = 0; j < N; j++)
  311. {
  312. ke[r][i][j] = (p0 / power) ^ (o0 / power) ^ (t / power);
  313. p0 %= power;
  314. t %= power;
  315. o0 %= power;
  316. power /= 256;
  317. }
  318. }
  319. }
  320. else
  321. {
  322. e[0] = rol_n(e[1], 24);
  323. e[1] = rol_n(e[2], 16);
  324. e[2] = rolb_n(e[3], 6);
  325. e[3] = rolb_n(e[0], 6);
  326. for (int i = 0; i < N; i++)
  327. {
  328. power = 16777216;
  329. p0 = e[i];
  330. t = mc[i];
  331. o0 = c[r];
  332. for (int j = 0; j < N; j++)
  333. {
  334. ke[r][i][j] = (p0 / power) ^ (o0 / power) ^ (t / power);
  335. p0 %= power;
  336. t %= power;
  337. o0 %= power;
  338. power /= 256;
  339. }
  340. }
  341. }
  342. }
  343. return ke;
  344. }
  345.  
  346. void out(int**X, ofstream&f)
  347. {
  348. for (int i = 0; i < N; i++)
  349. {
  350. for (int j = 0; j < N; j++)
  351. {
  352. f << hex << X[i][j] << ' ';
  353. }
  354.  
  355. f << '\n';
  356. }
  357. f << endl;
  358. }
  359.  
  360. int** encryption(int**P, int***Key)
  361. {
  362. int** C = new int*[N];
  363. for (int i = 0; i < N; i++)
  364. C[i] = new int[N];
  365.  
  366. for (int i = 0; i < N; i++)
  367. for (int j = 0; j < N; j++)
  368. C[i][j] = P[i][j];
  369. for (int i = 0; i < N; i++)
  370. for (int j = 0; j < N; j++)
  371. C[i][j] ^= Key[0][i][j];
  372.  
  373. int n, r;
  374. for (r = 1; r <=12; r++)//
  375. {
  376. n = (r - 1) % 2;
  377. C = Y(n, C);
  378. C = Pi(C, n);
  379. T(C);
  380. for (int i = 0; i < N; i++)
  381. for (int j = 0; j < N; j++)
  382. C[i][j] ^= Key[r][i][j];
  383.  
  384. }
  385. T(C);
  386. C = Pi(C, 1);
  387. T(C);
  388. return C;
  389. }
  390.  
  391. int** decryption(int**C, int***Key)
  392. {
  393. int** P = new int*[N];
  394. for (int i = 0; i < N; i++)
  395. P[i] = new int[N];
  396.  
  397. for (int i = 0; i < N; i++)
  398. for (int j = 0; j < N; j++)
  399. P[i][j] = C[i][j];
  400. T(P);
  401. P = Pi(P, 1);
  402. T(P);
  403. int ny, npi;
  404. for (int r = 12; r >= 1; r--)
  405. {
  406. for (int i = 0; i < N; i++)
  407. for (int j = 0; j < N; j++)
  408. P[i][j]^= Key[r][i][j];///
  409. T(P);
  410. ny = r % 2;
  411. npi = (r + 1) % 2;
  412. P = Pi(P, npi);
  413. P = Y(ny,P);
  414. }
  415. for (int i = 0; i < N; i++)
  416. for (int j = 0; j < N; j++)
  417. P[i][j]^= Key[0][i][j];
  418. return P;
  419. }
  420.  
  421. void Crypton(ofstream&f2, ofstream&f3)
  422. {
  423. int** C = new int*[N];
  424. for (int i = 0; i < N; i++)
  425. C[i] = new int[N];
  426.  
  427. int** P = new int*[N];
  428. for (int i = 0; i < N; i++)
  429. P[i] = new int[N];
  430.  
  431. for (int i = 0; i < N; i++)
  432. for (int j = 0; j < N; j++)
  433. P[i][j] = B[i*N + j];
  434. out(P, f2);
  435. int ***ke = new int**[13];
  436. for (int i = 0; i < 13; i++)
  437. {
  438. ke[i] = new int*[N];
  439. for (int j = 0; j < N; j++)
  440. ke[i][j] = new int[N];
  441. }
  442.  
  443. ke=key(KEY);
  444. C = encryption(P, ke);
  445. f2 << "Begin of decrypt" << endl;
  446. P = decryption(C, ke);
  447. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement