Viiitamibka

Lb_1_RSA

Apr 21st, 2022
911
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.60 KB | None | 0 0
  1. // Practice1_spring_pro.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <time.h>
  6. #include "\Program Files (x86)\Math (под VisualC++)\MMATH.H"
  7.  
  8. void PrintBin(M_LONG N, bool EOL);
  9. void PrintHex(M_LONG N, bool EOL = true) {
  10.     int word = N[0];
  11.     printf("%X ", N[word--]);
  12.     for (; word > 0; --word)
  13.         printf("%08X ", N[word]);
  14.     if (EOL)
  15.         printf("\n");
  16. }
  17. /*
  18. 16 - hex
  19. 10 - dec
  20. 2  - bin
  21.  
  22. 1 - false
  23. 0 -true
  24. */
  25. int PrintLONG(M_LONG N, DIGIT Base, bool EOL = true) {
  26.     if (Base != 16 && Base != 10 && Base != 2)
  27.         return 1;
  28.  
  29.     int word = N[0];
  30.     switch (Base)
  31.     {
  32.  
  33.     case 16:
  34.         printf("Hexidecimal: %X ", N[word--]);
  35.         for (; word > 0; --word)
  36.             printf(" %08X ", N[word]);
  37.         if (EOL)
  38.             printf("\n");
  39.         break;
  40.  
  41.     case 10:
  42.         printf("Decimal: %u ", N[word--]);
  43.         for (; word > 0; --word)
  44.             printf(" %010u ", N[word]);
  45.         if (EOL)
  46.             printf("\n");
  47.         break;
  48.  
  49.     case 2:
  50.         PrintBin(N, EOL);
  51.         break;
  52.     }
  53.     return 0;
  54. }
  55.  
  56. // для нормализованого числа. Длина корректная. Пример №7 в пз
  57. DIGIT BitLen(M_LONG N) {
  58.     DIGIT word, MSW;
  59.     int bit;
  60.     // нормализация числа. У MSW стоят 0.
  61.     word = N[0];
  62.     while (N[word] == 0 && word > 1)
  63.     {
  64.         --word;
  65.         N[0] = word; // Длина корректная
  66.     }
  67.     MSW = N[word];
  68.     for (bit = 31; (MSW & (1 << bit)) == 0 && bit >= 0; --bit);
  69.     bit = (word - 1) * 32 + bit + 1;
  70.     return bit;
  71. }
  72.  
  73. void PrintBin(M_LONG N, bool EOL = true)
  74. {
  75.     DIGIT word = N[0];
  76.     DIGIT MSW;
  77.     int bit;
  78.     // визначення позиции старшого значушого бита в старшому значушому слову (число нормализоане)
  79.  
  80.           // нормализация числа. У MSW стоят 0.
  81.     word = N[0];
  82.     while (N[word] == 0 && word > 1)
  83.     {
  84.         --word;
  85.         N[0] = word; // Длина корректная
  86.     }
  87.     MSW = N[word];
  88.     for (bit = 31; (MSW & (1 << bit)) == 0 && bit >= 0; --bit);
  89.  
  90.     for (; bit >= 0; --bit)
  91.     {
  92.         printf("%u", (N[word] >> bit) & 1);
  93.  
  94.     }
  95.     printf(" ");
  96.     --word;
  97.  
  98.     for (; word > 0; --word)
  99.     {
  100.         for (bit = 31; bit >= 0; --bit)
  101.         {
  102.             //printf("&u", (N[word] & (1 << bit)) >> bit); //Second option
  103.             printf("%u", (N[word] >> bit) & 1);
  104.             /* N[word] & (1 << bit);// First option
  105.              if (N[word] & (1 << bit)!=0)
  106.              {
  107.                  return 1;
  108.              }*/
  109.         }
  110.         printf(" ");
  111.     }
  112.     if (EOL)
  113.         printf("\n");
  114. }
  115.  
  116.  
  117. void GenRandBinVect(M_LONG P, int BitLen) {
  118.     int Len32;
  119.     srand(time(NULL));
  120.     Len32 = (BitLen + 31) / 32;
  121.     //Len32 = BitLen / 32 + (BitLen%32)?1:0;
  122.     m_rand(P, Len32);
  123.  
  124.     P[Len32] &= (1 << (BitLen % 32)) - 1;
  125.     P[Len32] |= (1 << ((BitLen % 32) - 1));
  126.  
  127. }
  128. int LemanTest(M_LONG P, int k) {//100-150
  129.     M_LONG P_1, P_1_2, a,res;
  130.     int i,counter=0;
  131.     m_copy(P_1, P);
  132.     P_1[1]--;
  133.     m_copy(P_1_2, P);
  134.     m_shr(P_1_2, 1);
  135.     for ( i = 0; i < k; ++i)
  136.     {
  137.         m_rand(a, P[0]);
  138.         m_blockmontpowmod(a, P_1_2, P, res);
  139.         if (res[0] == 1 && res[1] == 1)
  140.             continue;
  141.         if (m_cmp(res, P_1) == 0) {
  142.             ++counter;
  143.             continue;
  144.         }
  145.         return 1;
  146.     }
  147.     if (counter)
  148.         return 0; //pseudo prime
  149.     return 1; //composite
  150. }
  151.  
  152. int main()
  153. {
  154.     M_LONG   P = { 16,  0x6f18544d,0xedb374f5,0xffbc3bcc,0x7249bb52,
  155.             0xb09152ec,0x9551dc2c,0x7f6e2853,0xa4dba914,
  156.             0xa9bd6e9b,0x70cd54ce,0x31fe7bd3,0xcc61f6d2,
  157.             0x5d45c7fc,0x11a20acc,0x39b8708c,0x9df3ef1d },
  158.         Q = { 16,  0xab74d85d,0x8e352852,0xf440ab72,0x790f53f3,
  159.             0xb51fbad0,0x10555a11,0xd79b004c,0x90ca7e6c,
  160.             0x8bcca0b1,0xba0262f8,0xc2e3603d,0x52e68e5e,
  161.             0xb4a22921,0xa234ee79,0x5ae28905,0xf5fe50db };
  162.  
  163.     M_LONG N, FN, E, D, P_1, Q_1, two = { 1,2 }, M = { 1,3 }, C, M1;
  164.     char* str = (char*)&M[1];
  165.     //gets_s(str, 100);
  166.     // L = ByteLen / 4; k = (ByteLen % 4) * 8
  167.     //blabla = (1 << (strlen(str) % 4)) - 1
  168.     //M[1] &= blabla;
  169.     srand(time(NULL));
  170.     if (LemanTest(P, 10))
  171.     {
  172.         printf("Error");
  173.         return 1;
  174.     }else
  175.     {
  176.         printf("OK");
  177.         return 0;
  178.     }
  179.  
  180.     m_mul(P, Q, N);
  181.  
  182.     printf("P = "); PrintLONG(P, 16);
  183.     printf("Q = "); PrintLONG(Q, 16);
  184.     printf("N = "); PrintLONG(N, 16);
  185.  
  186.     m_copy(P_1, P); m_copy(Q_1, Q);
  187.     P_1[1]--; Q_1[1] &= 0XFFFFfffE;
  188.  
  189.     m_mul(P_1, Q_1, FN);
  190.  
  191.     printf("P = "); PrintLONG(P, 16);
  192.     printf("Q = "); PrintLONG(Q, 16);
  193.     printf("N = "); PrintLONG(N, 16);
  194.  
  195.     // Variant 1
  196.     do {
  197.         m_rand(E, FN[0] - 1);
  198.         // in loop using m_cmp() make sure size of FN < size of E
  199.         E[1] |= 1;
  200.     } while (m_inv(E, FN, D) || m_cmp(E, D) == 0);
  201.  
  202.     // Variant 2
  203.     //m_rand(E, FN[0] - 1);
  204.     //// in loop using m_cmp() make sure size of FN < size of E
  205.     //E[1] |= 1;
  206.     //while (m_inv(E, FN, D)  m_cmp(E, D) == 0) {
  207.     //    m_add(E, two, E);
  208.     //}
  209.  
  210.     // Variant 3
  211.     srand(time(NULL));
  212.     //do {
  213.     //    m_rand(E, FN[0]);
  214.     //} while (m_cmp(E, FN) >= 0);
  215.     //in loop using m_cmp() make sure size of FN < size of E
  216.     //E[1] |= 1;
  217.  
  218.     printf("\nE = "); PrintLONG(E, 16);
  219.     printf("D = "); PrintLONG(D, 16);
  220.  
  221.     while (m_inv(E, FN, D) || m_cmp(E, D) == 0) {
  222.         m_add(E, two, E);
  223.         // m_cmp(E,FN)>=0 ???
  224.     }
  225.     m_blockmontpowmod(M, E, N, C);
  226.     m_blockmontpowmod(C, D, N, M1);
  227.     if (m_cmp(M, M1) == 0) {
  228.         printf("\nM1 = M = %u", M1[1]);
  229.         printf("\nM = "); PrintLONG(M, 16);
  230.         printf("C = "); PrintLONG(C, 16);
  231.         printf("M1 = "); PrintLONG(M1, 16);
  232.     }
  233.     else {
  234.         printf("Error");
  235.     }
  236.  
  237.  
  238.    
  239. }
  240.  
  241. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  242. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  243.  
  244. // Советы по началу работы
  245. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  246. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  247. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  248. //   4. В окне "Список ошибок" можно просматривать ошибки.
  249. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  250. //   6. Чтобы с
  251.  
  252. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  253. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  254.  
  255. // Советы по началу работы
  256. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  257. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  258. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  259. //   4. В окне "Список ошибок" можно просматривать ошибки.
  260. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  261. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment