Advertisement
Uncleeee

Untitled

May 12th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.86 KB | None | 0 0
  1. #include "test.h"
  2. #include <string.h>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <time.h>
  6. #include <cstdlib>
  7. #include <ctime>
  8. #include <math.h>
  9. #include <map>
  10. #include <random>
  11. #include <conio.h>
  12. #include "windows.h"
  13. #include <string>
  14. #include <functional>
  15.  
  16. using namespace std;
  17. typedef long long big;
  18.  
  19.  
  20. big* evklid_(big a, big b)
  21. {
  22. big *U;
  23. U = new big[3];
  24. U[0] = a; U[1] = 1; U[2] = 0;
  25. big V[] = { b,0,1 }, T[3], q;
  26. while (V[0] != 0)
  27. {
  28. q = U[0]/V[0];
  29. for ( int i = 0; i < 3; i++)
  30. {
  31. T[i] = U[i] - q * V[i];
  32. }
  33. U[0] = V[0]; U[1] = V[1]; U[2] = V[2];
  34. U[0] = T[0]; V[1] = T[1]; V[2] = V[2];
  35. }
  36. return U;
  37.  
  38. }
  39. //Функция для нахождения элементов С и D системы RSA, возвращающая динамический массив
  40. big* gen_C_d_(big p)
  41. {
  42. big *cd;
  43. big *res;
  44. big s = sqrt(p);
  45.  
  46. cd = new big[2];
  47.  
  48. cd[0] = rand() % (p)+2;
  49.  
  50. while (nod_1(cd[0], p) != 1)
  51. cd[0] = rand() % (p)+2;
  52.  
  53. res = evklid_(cd[0],p);
  54. cd[1] = res[1];
  55. if (cd[1] <= 0)
  56. cd[1] = cd[1] + p;
  57. delete res;
  58. return cd;
  59. }
  60.  
  61. //Функция проверки на простоту
  62. int ferm_(big n)
  63. {
  64. big z, i, f;
  65. z = sqrt((double)n) + 1;
  66. for (i = 2; i <= z; i++)
  67. {
  68. if (n % i == 0)
  69. {
  70. f = 0;
  71. break;
  72. }
  73. else f = 1;
  74. }
  75. return f;
  76. }
  77.  
  78.  
  79. //Функция для генерации числа N системы RSA
  80. big* gen_n()
  81. {
  82. big p, q, *N;
  83. N = new big[2];
  84. while (1)
  85. {
  86. p = prov4(8);
  87. q = prov4(8);
  88. if (p != q)
  89. break;
  90. }
  91.  
  92. N[0] = p * q;
  93. N[1] = (p - 1)*(q - 1);
  94. return N;
  95. }
  96.  
  97.  
  98.  
  99. //Функция быстрого возведения в степень
  100. big pow_mod(big a, big x, big p)
  101. {
  102. big y=1, c=a;
  103. for(;x>0;x/=2)
  104. {
  105. if(x%2 == 1)
  106. y=(y*c)%p;
  107. c=(c*c)%p;
  108. }
  109.  
  110. return y;
  111.  
  112. }
  113.  
  114.  
  115. //Функция перемешивания вершин в массив vertex[]
  116.  
  117. void change_vertex_number(big *vertex, big v_count)
  118. {
  119. big i, j;
  120. for (i = 0; i < v_count; ++i)
  121. {
  122. vertex[i] = 0;
  123. }
  124.  
  125. for (i = 0; i < v_count; ++i)
  126. {
  127. j = rand() % v_count;
  128. while (vertex[j] != 0)
  129. j = rand() % v_count;
  130. vertex[j] = i;
  131. }
  132. }
  133.  
  134.  
  135. //Изменение начальной матрицы G согласно перемешанным вершинам в матрицу Н
  136. void change_init_matrix(big **init, big **mod, big *vertex, big e_count)
  137. {
  138.  
  139. big i, j;
  140. for (i = 0; i < 2; ++i)
  141. for (j = 0; j < e_count; ++j)
  142. {
  143. mod[i][j] = vertex[init[i][j]];
  144. }
  145. }
  146.  
  147. //Приписываем в матрицу Н элементы матрицы R так, чтобы элементы
  148. //полученной матрицы H'ij = Rij||Hij
  149. void change_trans_matrix(big **init, big **mod, big e_count, big **R)
  150. {
  151. big i, j, k;
  152.  
  153. for (i = 0; i < 2; ++i)
  154. {
  155. for (j = 0; j < e_count; ++j)
  156. {
  157. k = rand() % 6 + 1;
  158. R[i][j] = k * 10;
  159. mod[i][j] = init[i][j] + R[i][j];
  160.  
  161. }
  162.  
  163. }
  164. }
  165. //Шифрование мартрицы H' в F по RSA
  166. void crypting_matrix(big **init,big **mod,big N,big C, big e_count)
  167. {
  168. big i, j;
  169.  
  170. cout << C << endl;
  171. cout<< N << endl;
  172. for (i = 0; i < 2; ++i)
  173. for (j = 0; j < e_count; ++j)
  174. {
  175. mod[i][j] = mod_1(init[i][j], C, N);
  176. }
  177.  
  178. }
  179.  
  180. //Изменение Гамильтонова цикла, согласно перестановленных вершин массивa vertex[]
  181. void change_gam_cycle(big *vertex, big *init, big *mod, big v_count)
  182. {
  183. big i;
  184. for (i = 0; i < v_count; ++i)
  185. {
  186. mod[i] = init[vertex[i]];
  187. }
  188. }
  189. //Вывод матрицы размера 2 на e_count
  190. void print_matrix(big **mat, big e_count)
  191. {
  192. big i, j;
  193. for (i = 0; i < 2; ++i)
  194. {
  195. for (j = 0; j < e_count; ++j)
  196. cout << mat[i][j] << " ";
  197. cout << endl;
  198. }
  199. }
  200. //Вывод массива размера v_count
  201. void print_array(big *array, big v_count)
  202. {
  203. big i;
  204. for (i = 0; i < v_count; ++i)
  205. cout << array[i];
  206. cout << endl;
  207. cout << endl;
  208. }
  209. //Считывание матрицы размером 2 на e_count из файла
  210. void read_matrix(big e_count, big **G, ifstream& fin)
  211. {
  212. big i, j;
  213. big buf = 0;
  214. for (i = 0; i < 2; ++i)
  215. {
  216. for (j = 0; j < e_count; ++j)
  217. {
  218. fin>>buf;
  219. G[i][j] = buf;
  220. buf = 0;
  221. }
  222. }
  223. }
  224. //Считывание массива размером v_count из файла
  225. void read_cycle(big v_count, big *vertex, ifstream& fin)
  226. {
  227. big i, buf;
  228. for (i = 0; i < v_count; ++i)
  229. {
  230. fin >> buf;
  231. vertex[i] = buf;
  232. }
  233. }
  234.  
  235. //Поиск индекса элемента number
  236. big find_number(big * vertex, big number, big v_count)
  237. {
  238. big i;
  239. for (i = 0; i < v_count; ++i)
  240. {
  241. if (vertex[i] == number)
  242. return i;
  243. }
  244. }
  245.  
  246. int main()
  247. {
  248. setlocale(LC_ALL, "Rus");
  249. int i, choise, count, j;
  250. big v_count, *mod_gam_cycle, *vertex, e_count, **G, **H, **Ht, **F, *n, *cd, N, C, D, *gam_cycle, **R;
  251.  
  252.  
  253. //Считывание из файла n и m
  254. ifstream fin;
  255. fin.open("cycle12.txt");
  256. if (!fin.is_open())
  257. {
  258. cout << "Ошибка открытия файла!" << endl;
  259. }
  260. //else //cout << "Файл открыт!" << endl;
  261. fin >> v_count;
  262. fin >> e_count;
  263.  
  264. n = gen_n();
  265. cout << n << endl;
  266. N = n[0];
  267. cd = gen_C_d_(n[1]);
  268. C = cd[1];
  269. D = cd[0];
  270.  
  271. cout << "Значения ключей: " << endl;
  272.  
  273. cout << "N = " << N << endl;
  274. cout << "C = " << C << endl;
  275. cout << "D = " << D << endl;
  276.  
  277. delete n;
  278. delete cd;
  279.  
  280. //Динамическиое объявление массивов и матриц
  281. mod_gam_cycle = new big[v_count];
  282.  
  283. G = new big *[2];
  284. H = new big *[2];
  285. Ht = new big *[2];
  286. F = new big*[2];
  287. R = new big*[2];
  288.  
  289.  
  290.  
  291. vertex = new big[v_count];
  292. gam_cycle = new big[v_count];
  293.  
  294. for (i = 0; i < e_count; ++i)
  295. {
  296. R[i] = new big[e_count];
  297. G[i] = new big[e_count];
  298. H[i] = new big[e_count];
  299. Ht[i] = new big[e_count];
  300. F[i] = new big[e_count];
  301. }
  302. //Считывание маарицы и Гамильтонова цикла из файла
  303.  
  304.  
  305. read_matrix(e_count, G, fin);
  306.  
  307.  
  308. read_cycle(v_count, gam_cycle, fin);
  309. cout << "Гамельтонов цикл: ";
  310. print_array(gam_cycle, v_count);
  311. cout << "Граф:" << endl;
  312. print_matrix(G, e_count);
  313. cout << endl;
  314.  
  315. cout << "Введите количество задаваемых вопросов:" << endl;
  316. cin >> count;
  317.  
  318.  
  319.  
  320. while (count > 0)
  321. {
  322. system("cls");
  323. //Выберите вопрос
  324. // printf("Please make choise\n1 - Show Gamilton's cycle\n2 - Graph H is isomorphic of G?\n");
  325. cout << "Выерите действие:" << endl << "1 - Показать гамельтонов цикл" << endl << "2 - Доказать изоморфность графа." << endl;
  326. cin >> choise;
  327. //Перемешивание вершин исходной матрицы
  328. change_vertex_number(vertex, v_count);
  329. //Создание изоморфной матрицы
  330.  
  331. change_init_matrix(G, H, vertex, e_count);
  332.  
  333. print_matrix(H, e_count);
  334.  
  335. //Производим слияние изоморфной матрицы с матрицой R для
  336. //подготовки к шифрованию
  337. change_trans_matrix(H, Ht, e_count, R);
  338. //Шифрование марицы
  339. crypting_matrix(Ht, F, N, C, e_count);
  340. //Изменение Гамильтонова цикла, согласно перемешанным вершинам
  341. change_gam_cycle(vertex, gam_cycle, mod_gam_cycle, v_count);
  342. //После Боб получает шифрованную матрицу и в зависимости от
  343. //вопроса получает ответ
  344. printf("Matrix F:\n");
  345. print_matrix(F, e_count);
  346.  
  347. switch (choise)
  348. {
  349. //Получение Гамильтонова цикла
  350. case 1:
  351. //Вывод модифицированного Гамильтонова цикла
  352. cout << "Модифицированный цикл:" << endl;
  353. print_array(mod_gam_cycle, v_count);
  354. //Вывод изоморфной матрицы для сравнения с Гамильтоновым циклом
  355. cout << "Изоморфный граф для проверки:" << endl;
  356. cout<<"4411675502"<<endl;
  357. cout<<"1767500233"<<endl;
  358. break;
  359. //Доказательство изоморфности графа
  360. case 2:
  361. /* printf("Modificated transverse matrix Ht:\n");
  362. print_matrix(Ht, e_count);*/
  363. cout << "Изоморфный граф:" << endl;
  364. print_matrix(H, e_count);
  365. /* printf("Transverse array :\n");
  366. print_array(vertex, v_count);*/
  367.  
  368. cout << "Исходный граф:" << endl;
  369. for (i = 0; i < 2; ++i)
  370. {
  371. for (j = 0; j < e_count; ++j)
  372. {
  373. cout << find_number(vertex, H[i][j], v_count);
  374. }
  375. cout << endl;
  376. }
  377. break;
  378. }
  379. system("pause");
  380. count--;
  381.  
  382. }
  383.  
  384. for (i = 0; i < 2; ++i)
  385. {
  386. delete H[i];
  387. delete Ht[i];
  388. delete F[i];
  389. delete R[i];
  390. }
  391. printf("All rigth\n");
  392. fin.close();
  393. return 0;
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement