Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 41.73 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Numerics;
  6. using System.Text;
  7. using System.Security.Cryptography;
  8.  
  9. namespace methods4
  10. {
  11.     class Program
  12.     {
  13.         public static Random rand = new Random();
  14.         public static BigInteger p, A, NR, r, l;
  15.         public static int w = 0, cnt;
  16.         public static bool flag, flag1 = true, flag2 = true;
  17.         public static List <BigInteger> NR_;
  18.         public static List <BigInteger> Q = new List<BigInteger>();
  19.         public static void DeleteFiles(bool flag = false)
  20.         {
  21.             foreach (var item in Directory.GetFiles(Environment.CurrentDirectory))
  22.             {
  23.                 if (flag == false)
  24.                     continue;
  25.                 if (Path.GetExtension(item) == ".txt")
  26.                     File.Delete(item);
  27.             }
  28.         }
  29.         public static void ReadOptions()
  30.         {
  31.             using (var sr = new StreamReader(File.Open("ElipticCurve.txt", FileMode.Open), Encoding.Default))
  32.             {
  33.                 p = BigInteger.Parse(sr.ReadLine());
  34.                 A = BigInteger.Parse(sr.ReadLine());
  35.                 r = BigInteger.Parse(sr.ReadLine());
  36.                 Q.Add(BigInteger.Parse(sr.ReadLine()));
  37.                 Q.Add(BigInteger.Parse(sr.ReadLine()));
  38.             }
  39.         }
  40.         private static void Start()
  41.         {
  42.             if (!flag2)
  43.                 return;
  44.             Console.WriteLine("Введите: ");
  45.             Console.WriteLine("\t1 - Если хотите сгенерировать эллиптическую кривую");
  46.             Console.WriteLine("\t2 - Если хотите сгенерировать значение l");
  47.             Console.WriteLine("\t3 - Если хотите провести опознавание на основе диалоговых доказательств с нулевым разглашением");
  48.             Console.WriteLine("\t0 - Выход");
  49.         }
  50.         private static void GenerateL()
  51.         {
  52.             Console.Write("Введите значение l: ");
  53.             l = BigInteger.Parse(Console.ReadLine());
  54.             try
  55.             {
  56.                 using (var write = new StreamWriter(File.Open("l.txt", FileMode.OpenOrCreate)))
  57.                 {
  58.                     write.WriteLine(l);
  59.                 }
  60.             }
  61.             catch (FileNotFoundException)
  62.             {
  63.                 throw new FileNotFoundException();
  64.             }
  65.         }
  66.         public static void Protocol()
  67.         {
  68.             try
  69.             {
  70.                 Q.Clear();
  71.                 ReadOptions();
  72.                 int step = 0;
  73.                 try
  74.                 {
  75.                     cnt = int.Parse(File.ReadAllText("cnt.txt"));
  76.                 }
  77.                 catch
  78.                 {
  79.                     cnt = 0;
  80.                 }
  81.                 while (true)
  82.                 {
  83.                     if (!flag1)
  84.                     {
  85.                         flag1 = true;
  86.                         return;
  87.                     }
  88.                     Console.WriteLine("Введите номер шага, который хотите исполнить: ");
  89.                     Console.WriteLine("\t1 - Если хотите выполнить первый шаг алгоритма (сгенерировать случайный показатель k)");
  90.                     Console.WriteLine("\t2 - Если хотите выполнить второй шаг алгоритма (убедиться, что rR = бесконечности, и сгенерировать случайный бит)");
  91.                     Console.WriteLine("\t3 - Если хотите выполнить третий шаг алгоритма (предъявить показатель в зависимости от бита)");
  92.                     Console.WriteLine("\t4 - Если хотите выполнить четвертый шаг алгоритма (итоговую проверку верификатора)");
  93.                     Console.WriteLine("\t0 - Выход");
  94.                     int mode;
  95.                     flag = true;
  96.                     try
  97.                     {
  98.                         mode = int.Parse(Console.ReadLine());
  99.                     }
  100.                     catch (FormatException)
  101.                     {
  102.                         continue;
  103.                     }
  104.                     //Console.Clear();
  105.                     try
  106.                     {
  107.                         switch (mode)
  108.                         {
  109.                             case 1:
  110.                                 {
  111.                                     Step1();
  112.                                     step = 1;
  113.                                     using (var write = new StreamWriter(File.Open("Step.txt", FileMode.OpenOrCreate)))
  114.                                     {
  115.                                         write.WriteLine(step);
  116.                                     }
  117.                                     break;
  118.                                 }
  119.                             case 2:
  120.                                 {
  121.                                     try
  122.                                     {
  123.                                         step = int.Parse(File.ReadAllText("Step.txt"));
  124.                                     }
  125.                                     catch
  126.                                     {
  127.                                         DeleteFiles();
  128.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 1");
  129.                                         flag = false;
  130.                                         break;
  131.                                     }
  132.                                     if (step != 1 && step != 2)
  133.                                     {
  134.                                         DeleteFiles();
  135.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 1");
  136.                                         flag = false;
  137.                                         break;
  138.                                     }
  139.                                     if (!Step2())
  140.                                     {
  141.                                         DeleteFiles();
  142.                                         Console.WriteLine("Верификатор не убедился на 2 шаге");
  143.                                         File.Delete("l.txt");
  144.                                         flag2 = false;
  145.                                         return;
  146.                                     }
  147.                                     step = 2;
  148.                                     using (var write = new StreamWriter(File.Open("Step.txt", FileMode.OpenOrCreate)))
  149.                                     {
  150.                                         write.WriteLine(step);
  151.                                     }
  152.                                     break;
  153.                                 }
  154.                             case 3:
  155.                                 {
  156.                                     try
  157.                                     {
  158.                                         step = int.Parse(File.ReadAllText("Step.txt"));
  159.                                     }
  160.                                     catch
  161.                                     {
  162.                                         DeleteFiles();
  163.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 2");
  164.                                         flag = false;
  165.                                         break;
  166.                                     }
  167.                                     if (step != 2 && step != 3)
  168.                                     {
  169.                                         DeleteFiles();
  170.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 2!");
  171.                                         flag = false;
  172.                                         break;
  173.                                     }
  174.                                     Step3();
  175.                                     step = 3;
  176.                                     using (var write = new StreamWriter(File.Open("Step.txt", FileMode.OpenOrCreate)))
  177.                                     {
  178.                                         write.WriteLine(step);
  179.                                     }
  180.                                     break;
  181.                                 }
  182.                             case 4:
  183.                                 {
  184.                                     try
  185.                                     {
  186.                                         step = int.Parse(File.ReadAllText("Step.txt"));
  187.                                     }
  188.                                     catch
  189.                                     {
  190.                                         DeleteFiles();
  191.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 3");
  192.                                         flag = false;
  193.                                         break;
  194.                                     }
  195.                                     if (step != 3 && step != 4)
  196.                                     {
  197.                                         DeleteFiles();
  198.                                         Console.WriteLine("Ошибка! Сначала выполните шаг 3!");
  199.                                         flag = false;
  200.                                         break;
  201.                                     }
  202.                                     if (step == 3)
  203.                                         cnt++;
  204.                                     try
  205.                                     {
  206.                                         using (var write = new StreamWriter(File.Open("cnt.txt", FileMode.OpenOrCreate)))
  207.                                         {
  208.                                             write.WriteLine(cnt);
  209.                                         }
  210.                                     }
  211.                                     catch (FileNotFoundException)
  212.                                     {
  213.                                         throw new FileNotFoundException();
  214.                                     }
  215.                                     if (Step4())
  216.                                     {
  217.                                         Console.WriteLine("Претендент знает логарифм l с вероятностью " + (1 - (double)1 / Math.Pow(2, cnt)));
  218.                                     }
  219.                                     else
  220.                                     {
  221.                                         Console.WriteLine("Претендент не знает логарифм l");
  222.                                         File.Delete("l.txt");
  223.                                         flag2 = false;
  224.                                         return;
  225.                                     }
  226.                                     using (var write = new StreamWriter(File.Open("Step.txt", FileMode.OpenOrCreate)))
  227.                                     {
  228.                                         write.WriteLine(4);
  229.                                     }
  230.                                     step = 0;
  231.                                     break;
  232.                                 }
  233.                             case 0:
  234.                                 {
  235.                                     return;
  236.                                 }
  237.                             default:
  238.                             {
  239.                                 Console.WriteLine("Введена некорректная команда");
  240.                                 flag = false;
  241.                                 break;
  242.                             }
  243.                         }
  244.                         if (flag)
  245.                         {
  246.                             Console.WriteLine("Выполнен шаг " + mode);
  247.  
  248.                             Console.ReadLine();
  249.                             //Console.Clear();
  250.                         }
  251.                     }
  252.                     catch (FileNotFoundException er)
  253.                     {
  254.                         Console.WriteLine(er.Message);
  255.                         DeleteFiles();
  256.                         return;
  257.                     }
  258.                 }
  259.             }
  260.             catch (FormatException)
  261.             {
  262.                 throw;
  263.             }
  264.             catch (FileNotFoundException)
  265.             {
  266.                 throw;
  267.             }
  268.             catch (Exception)
  269.             {
  270.                 throw;
  271.             }
  272.         }
  273.         public static void Step1()
  274.         {
  275.             try
  276.             {
  277.                 l = int.Parse(File.ReadAllText("l.txt"));
  278.             }
  279.             catch
  280.             {
  281.                 Console.WriteLine("Ошибка! Не задано значение l");
  282.                 Console.ReadLine();
  283.                 flag = false;
  284.                 flag1 = false;
  285.                 return;
  286.             }
  287.            
  288.             BigInteger k = rand.Next(2, (int)r);
  289.             BigInteger _k = (k * l) % r;
  290.            
  291.             var P = QuickSumPoint(Q, l, A, p);
  292.             var R = QuickSumPoint(P, k, A, p);
  293.  
  294.             try
  295.             {
  296.                 using (var write = new StreamWriter(File.Open("P.txt", FileMode.OpenOrCreate)))
  297.                 {
  298.                     write.WriteLine(P[0]);
  299.                     write.WriteLine(P[1]);
  300.                 }
  301.  
  302.                 using (var write = new StreamWriter(File.Open("R.txt", FileMode.OpenOrCreate)))
  303.                 {
  304.                     write.WriteLine(R[0]);
  305.                     write.WriteLine(R[1]);
  306.                 }
  307.  
  308.                 using (var write = new StreamWriter(File.Open("k.txt", FileMode.OpenOrCreate)))
  309.                 {
  310.                     write.WriteLine(k);
  311.                 }
  312.  
  313.                 using (var write = new StreamWriter(File.Open("k_.txt", FileMode.Create)))
  314.                 {
  315.                     write.WriteLine(_k);
  316.                 }
  317.             }
  318.             catch (FileNotFoundException)
  319.             {
  320.                  throw new FileNotFoundException();
  321.             }
  322.         }
  323.         public static bool Step2()
  324.         {
  325.             try
  326.             {
  327.                 var R = new List<BigInteger>();
  328.                 using (var sr = new StreamReader(File.Open("R.txt", FileMode.Open), Encoding.Default))
  329.                 {
  330.                     R.Add(BigInteger.Parse(sr.ReadLine()));
  331.                     R.Add(BigInteger.Parse(sr.ReadLine()));
  332.                 }
  333.  
  334.                 var infP = QuickSumPoint(R, r, A, p);
  335.                
  336.                 if (infP.Any() || !R.Any())
  337.                 {
  338.                     return false;
  339.                 }
  340.  
  341.                 int b;
  342.                 b = rand.Next(0, 2);
  343.                
  344.                 using (var write = new StreamWriter(File.Open("RandomBit.txt", FileMode.Create)))
  345.                 {
  346.                     write.WriteLine(b);
  347.                 }
  348.             }
  349.             catch (FileNotFoundException)
  350.             {
  351.                 throw new FileNotFoundException();
  352.             }
  353.             return true;
  354.         }
  355.         public static void Step3()
  356.         {
  357.             try
  358.             {
  359.                 int b = int.Parse(File.ReadAllText("RandomBit.txt"));
  360.                 if (b == 0)
  361.                 {
  362.                     File.Copy("k.txt", "TransmissionChannel.txt", true);
  363.                 }
  364.                 else if (b == 1)
  365.                 {
  366.                     File.Copy("k_.txt", "TransmissionChannel.txt", true);
  367.                 }
  368.             }
  369.             catch (FileNotFoundException)
  370.             {
  371.                 throw new FileNotFoundException();
  372.             }
  373.         }
  374.         public static bool Step4()
  375.         {
  376.             try
  377.             {
  378.                 int b = int.Parse(File.ReadAllText("RandomBit.txt"));
  379.                 var R = new List<BigInteger>();
  380.                 using (var sr = new StreamReader(File.Open("R.txt", FileMode.Open), Encoding.Default))
  381.                 {
  382.                     R.Add(BigInteger.Parse(sr.ReadLine()));
  383.                     R.Add(BigInteger.Parse(sr.ReadLine()));
  384.                 }
  385.  
  386.                 var P = new List<BigInteger>();
  387.                 using (var sr = new StreamReader(File.Open("P.txt", FileMode.Open), Encoding.Default))
  388.                 {
  389.                     P.Add(BigInteger.Parse(sr.ReadLine()));
  390.                     P.Add(BigInteger.Parse(sr.ReadLine()));
  391.                 }
  392.                 if (b == 0)
  393.                 {
  394.                     var k = BigInteger.Parse(File.ReadAllText("TransmissionChannel.txt"));
  395.                     var t = QuickSumPoint(P, k, A, p);
  396.                     return R[0] == t[0] && R[1] == t[1];
  397.                 }
  398.                 else if (b == 1)
  399.                 {
  400.                     var k_ = BigInteger.Parse(File.ReadAllText("TransmissionChannel.txt"));
  401.                     var t = QuickSumPoint(Q, k_, A, p);
  402.                     return R[0] == t[0] && R[1] == t[1];
  403.                 }
  404.                 return false;
  405.             }
  406.             catch (FileNotFoundException)
  407.             {
  408.                 throw new FileNotFoundException();
  409.             }
  410.         }
  411.         public static void GenerateEC()
  412.         {
  413.             int m = 5;
  414.             BigInteger D = 1;
  415.             bool t = true;
  416.             Console.Write("Введите длину характеристики поля l = ");
  417.             int l1 = int.Parse(Console.ReadLine());
  418.             if (l1 <= 4)
  419.             {
  420.                 Console.WriteLine("Длина характеристики поля <= 4. Введите корректную длину!");
  421.                 return;
  422.             }
  423.  
  424.             w = m;
  425.             while (true)
  426.             {
  427.          step1: while (true)
  428.                 {
  429.                     t = true;
  430.                     List<BigInteger> decomposition;
  431.                     FindPrimeNumberOfLength(l1);
  432.                     decomposition = Decomposition_P(D, p);
  433.  
  434.                     NR_ = NR_function(decomposition[0], decomposition[1], p);
  435.  
  436.                     if (!NR_.Any())
  437.                         goto step1;
  438.  
  439.                     if (p != NR_[1])
  440.                     {
  441.                         for (int i = 1; i <= m; i++)
  442.                         {
  443.                             if (BigInteger.ModPow(p, i, NR_[1]) == 0)
  444.                             {
  445.                                 w = w + 1;
  446.                                 if (w > 10)
  447.                                 {
  448.                                     Console.WriteLine("Нет p, удовлятворяющего всем условиям");
  449.                                     return;
  450.                                 }
  451.                                 goto step1;
  452.                             }
  453.                         }
  454.                         break;
  455.                     }
  456.                     goto step1;
  457.                 }
  458.                 int j = 1;
  459.                 BigInteger k = 2, counter = 0;
  460.                 List <BigInteger> x0y0 = new List <BigInteger>();
  461.  
  462.          step5: while (true)
  463.                 {
  464.                     if (NR_[0] == NR_[1] * 2)
  465.                         CheckA(ref t, ref k, 2);
  466.                    
  467.                     else
  468.                         CheckA(ref t, ref k, 4);
  469.                    
  470.                     if (!t)
  471.                         goto step6;
  472.                     x0y0 = new List<BigInteger>();
  473.                     for (int i = j; ; i++, j++)
  474.                     {
  475.                         BigInteger z = (A * i + i * i * i) % p;
  476.                         if (Legendre(z, p) == 1)
  477.                         {
  478.                             if (SqrtMod(z, p) == 0)
  479.                                 continue;
  480.                             else
  481.                             {
  482.                                 x0y0.Add(i);
  483.                                 x0y0.Add(SqrtMod(z, p));
  484.                             }
  485.                             i++;
  486.                             j++;
  487.                             break;
  488.                         }
  489.                     }
  490.  
  491.                     BigInteger cnt = NR_[0];
  492.                     List <BigInteger> Nx0y0 = QuickSumPoint(x0y0, cnt, A, p);
  493.  
  494.                     if (Nx0y0.Any())
  495.                     {
  496.                         if (counter++ < 100)
  497.                             goto step5;
  498.                         else
  499.                         {
  500.                             goto step1;
  501.                         }
  502.                     }
  503.                     break;
  504.                 }
  505.  
  506.             step6:
  507.                 if (!t)
  508.                     continue;
  509.                 NR = NR_[0] / NR_[1];
  510.  
  511.                 List <BigInteger> Q = QuickSumPoint(x0y0, NR, A, p);
  512.  
  513.                 if (!Q.Any() || Q[1] == 0)
  514.                     continue;
  515.                
  516.                 Console.WriteLine("p = " + p);
  517.                 Console.WriteLine("r = " + NR_[1]);
  518.                 Console.WriteLine("A = " + A);
  519.                 Console.WriteLine("Q = (" + Q[0] + ", " + Q[1] + ")");
  520.                 WriteToFiles(Q);
  521.                 break;
  522.             }
  523.         }
  524.         static BigInteger Pow(BigInteger a, BigInteger b)
  525.         {
  526.             BigInteger result = 1;
  527.             for (BigInteger i = 0; i < b; i++)
  528.                 result *= a;
  529.        
  530.             return result;
  531.         }
  532.         static bool IsPrime(BigInteger p)
  533.         {
  534.             BigInteger rounds = 30, t = p - 1;
  535.             if (p == 2 || p == 3)
  536.                 return true;
  537.  
  538.             if (p < 2 || p % 2 == 0)
  539.                 return false;
  540.  
  541.             int s = 0;
  542.             while (t % 2 == 0)
  543.             {
  544.                 t /= 2;
  545.                 s += 1;
  546.             }
  547.  
  548.             for (int i = 0; i < rounds; i++)
  549.             {
  550.                 RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  551.                 byte[] _a = new byte[p.ToByteArray().LongLength];
  552.                 BigInteger a;
  553.                 do
  554.                 {
  555.                     rng.GetBytes(_a);
  556.                     a = new BigInteger(_a);
  557.                 }
  558.                 while (a < 2 || a >= p - 2);
  559.  
  560.                 BigInteger x = BigInteger.ModPow(a, t, p);
  561.                 if (x == 1 || x == p - 1)
  562.                     continue;
  563.  
  564.                 for (int r = 1; r < s; r++)
  565.                 {
  566.                     x = BigInteger.ModPow(x, 2, p);
  567.  
  568.                     if (x == 1)
  569.                         return false;
  570.  
  571.                     if (x == p - 1)
  572.                         break;
  573.                 }
  574.  
  575.                 if (x != p - 1)
  576.                     return false;
  577.             }
  578.             return true;
  579.         }
  580.         static BigInteger GenerateNumberOfLength(int l)
  581.         {
  582.             RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  583.             byte[] _result = new byte[BigInteger.Pow(2, l).ToByteArray().LongLength];
  584.             BigInteger result;
  585.             do
  586.             {
  587.                 rng.GetBytes(_result);
  588.                 result = new BigInteger(_result);
  589.             } while (result <= BigInteger.Pow(2, (l - 1)) || result >= BigInteger.Pow(2, l));
  590.            
  591.             return result;
  592.         }
  593.         static BigInteger GenerateSimpleNumberOfLength(int l)
  594.         {  
  595.             BigInteger result;
  596.             result = GenerateNumberOfLength(l);
  597.             while (!IsPrime(result))
  598.             {  
  599.                 result = GenerateNumberOfLength(l);
  600.             }
  601.             return result;
  602.         }
  603.         private static void FindPrimeNumberOfLength(int l)
  604.         {
  605.             do
  606.             {
  607.                 p = GenerateSimpleNumberOfLength(l);
  608.             } while ((p % 4) != 1);
  609.         }
  610.         private static void WriteToFiles(List <BigInteger> Q)
  611.         {
  612.             using (StreamWriter f = new StreamWriter(File.Open("ElipticCurve.txt", FileMode.Create), Encoding.Default))
  613.             {
  614.                 f.WriteLine(p);
  615.                 f.WriteLine(A);
  616.                 f.WriteLine(NR_[1]);
  617.                 f.WriteLine(Q[0]);
  618.                 f.WriteLine(Q[1]);
  619.             }
  620.             return;
  621.         }
  622.         private static void WriteToFiles2(List <BigInteger> Q)
  623.         {
  624.             using (StreamWriter f = new StreamWriter(File.Open("ElipticCurve.txt", FileMode.Create), Encoding.Default))
  625.             {
  626.                 f.WriteLine(p);
  627.                 f.WriteLine(A);
  628.                 f.WriteLine(r);
  629.                 f.WriteLine(Q[0]);
  630.                 f.WriteLine(Q[1]);
  631.             }
  632.             return;
  633.         }
  634.         private static Boolean CheckSqrt(BigInteger n, BigInteger root)
  635.         {
  636.             BigInteger lowerBound = root * root, upperBound = (root + 1) * (root + 1);
  637.  
  638.             return (n >= lowerBound && n < upperBound);
  639.         }
  640.         public static BigInteger Sqrt_N(BigInteger N)
  641.         {
  642.             if (N == 0)
  643.                 return 0;
  644.  
  645.             if (N > 0)
  646.             {
  647.                 int bitLength = Convert.ToInt32(Math.Ceiling(BigInteger.Log(N, 2)));
  648.                 BigInteger root = BigInteger.One << (bitLength / 2);
  649.  
  650.                 while (!CheckSqrt(N, root))
  651.                 {
  652.                     root += N / root;
  653.                     root /= 2;
  654.                 }
  655.                 return root;
  656.             }
  657.             throw new ArithmeticException("NaN");
  658.         }
  659.         static BigInteger BinaryEuclide(BigInteger a, BigInteger b)
  660.         {
  661.             BigInteger g = 1;
  662.             while (a % 2 == 0 && b % 2 == 0)
  663.             {
  664.                 a = a / 2;
  665.                 b = b / 2;
  666.                 g = 2 * g;
  667.             }
  668.             BigInteger u = a, v = b;
  669.             while (u != 0)
  670.             {
  671.                 while (u % 2 == 0) u = u / 2;
  672.                 while (v % 2 == 0) v = v / 2;
  673.                 if (u >= v) u = u - v;
  674.                 else v = v - u;
  675.             }
  676.             return g * v;
  677.         }
  678.         static Tuple<BigInteger,BigInteger> ExtendedEuclide(BigInteger a, BigInteger b)
  679.         {
  680.             BigInteger r0 = a, r1 = b, x0 = 1, x1 = 0, y0 = 0, y1 = 1, x, y, d;
  681.             while (true)
  682.             {
  683.                 BigInteger q = r0 / r1, r = r0 % r1;
  684.                 if (r == 0)
  685.                     break;
  686.                 else
  687.                 {
  688.                     r0 = r1;
  689.                     r1 = r;
  690.                     x = x0 - q * x1;
  691.                     x0 = x1;
  692.                     x1 = x;
  693.                     y = y0 - q * y1;
  694.                     y0 = y1;
  695.                     y1 = y;
  696.                 }
  697.             }
  698.             d = r1;
  699.             x = x1;
  700.             y = y1;
  701.             return new Tuple<BigInteger,BigInteger>(x, y);
  702.         }
  703.         public static int Legendre(BigInteger a, BigInteger p)
  704.         {
  705.             if (p < 2)
  706.                 Console.WriteLine("P должно быть больше 2");
  707.             if (a == 0)
  708.                 return 0;
  709.            
  710.             if (a == 1)
  711.                 return 1;
  712.            
  713.             int result;
  714.             if (a < 0)
  715.             {
  716.                 result = Legendre(-a, p);
  717.                 BigInteger deg = (p - 1) / 2;
  718.                 if (deg % 2 != 0) result = -result;
  719.             }
  720.             else
  721.             {
  722.                 if (a % 2 == 0)
  723.                 {
  724.                     result = Legendre(a / 2, p);
  725.                     BigInteger deg = (p * p - 1) / 8;
  726.                     if (deg % 2 != 0) result = -result;
  727.                 }
  728.                 else
  729.                 {
  730.                     result = Legendre(p % a, a);
  731.                     BigInteger deg = (a - 1) * ((p - 1) / (4));
  732.                     if (deg % 2 != 0) result = -result;
  733.                 }
  734.             }
  735.             return result;
  736.         }
  737.         static BigInteger Jacobi(BigInteger a, BigInteger n)
  738.         {
  739.             if (BinaryEuclide(a, n) != 1)
  740.                 return 0;
  741.            
  742.             BigInteger r = 1;
  743.             if (a < 0)
  744.             {
  745.                 a = -a;
  746.                 if (n % 4 == 3)
  747.                     r = -r;
  748.             }
  749.             while (a != 0)
  750.             {
  751.                 BigInteger k = 0;
  752.                 while (a % 2 == 0)
  753.                 {
  754.                     k++;
  755.                     a = a / 2;
  756.                 }
  757.                 if (k % 2 != 0)
  758.                 {
  759.                     if (n % 8 == 3 || n % 8 == 5)
  760.                         r = -r;
  761.                 }
  762.                 if (n % 4 == 3 && a % 4 == 3)
  763.                     r = -r;
  764.                
  765.                 BigInteger temp = a;
  766.                 a = n % a;
  767.                 n = temp;
  768.             }
  769.             return r;
  770.         }
  771.         static List<BigInteger> ComparisonSolution(BigInteger a, BigInteger b, BigInteger m)
  772.         {
  773.             List<BigInteger> answer = new List<BigInteger>();
  774.             BigInteger d = BinaryEuclide(a, m);
  775.             if (b % d != 0)
  776.                 return answer;
  777.            
  778.             else
  779.             {
  780.                 BigInteger a1 = a / d, b1 = b / d, m1 = m / d;
  781.                 Tuple<BigInteger, BigInteger> xy = ExtendedEuclide(a1, m1);
  782.                 BigInteger x0 = (b1 * xy.Item1) % m1;
  783.                 while (x0 < 0)
  784.                     x0 = x0 + m1;
  785.                 answer.Add(x0 % m1);
  786.             }
  787.             return answer;
  788.         }
  789.         static BigInteger ReverseElement(BigInteger a, BigInteger m)
  790.         {
  791.             BigInteger d = BinaryEuclide(a, m);
  792.             if (d != 1)
  793.                 return -1;
  794.            
  795.             else
  796.             {
  797.                 List<BigInteger> answer = ComparisonSolution(a, 1, m);
  798.                 return answer[0];
  799.             }
  800.         }
  801.         static BigInteger SqrtMod(BigInteger a, BigInteger p)
  802.         {
  803.             a += p;
  804.             BigInteger jacobi = Jacobi(a, p);
  805.             if (jacobi == -1)
  806.                 return 0;
  807.            
  808.             int N = 0;
  809.             if (jacobi == 1)
  810.             {
  811.                 for (int i = 2; i < p; i++)
  812.                 {
  813.                     if (Jacobi(i, p) == -1)
  814.                     {
  815.                         N = i;
  816.                         break;
  817.                     }
  818.                 }
  819.             }
  820.             BigInteger h = p - 1;
  821.             int k = 0;
  822.             while (h % 2 == 0)
  823.             {
  824.                 k++;
  825.                 h = h / 2;
  826.             }
  827.             BigInteger a1 = (int)BigInteger.ModPow(a, (h + 1) / 2, p);
  828.             BigInteger a2 = ReverseElement(a, p);
  829.             BigInteger N1 = BigInteger.ModPow(N, h, p);
  830.             BigInteger N2 = 1;
  831.             BigInteger[] j = new BigInteger[k - 1];
  832.             for (int i = 0; i <= k - 2; i++)
  833.             {
  834.                 BigInteger b = (a1 * N2) % p;
  835.                 BigInteger c = (a2 * b * b) % p;
  836.                 BigInteger pow = Pow(2, k - 2 - i);
  837.                 BigInteger d = BigInteger.ModPow(c, pow, p);
  838.                 if (d == 1)
  839.                     j[i] = 0;
  840.                
  841.                 if (d == p - 1 || d - p == -1)
  842.                     j[i] = 1;
  843.                
  844.                 N2 = (N2 * (BigInteger.ModPow(N1, BigInteger.Pow(2, i) * j[i], p))) % p;
  845.             }
  846.             BigInteger answer = (a1 * N2) % p;
  847.             BigInteger answer1 = (-answer + p) % p;
  848.             return answer;
  849.         }
  850.         public static List<BigInteger> Decomposition_P(BigInteger D, BigInteger p)
  851.         {
  852.             if (Legendre(-D, p) == -1)
  853.                 return new List<BigInteger>();
  854.             BigInteger R = SqrtMod(-D, p);
  855.             int i = 0;
  856.             List<BigInteger> U = new List<BigInteger>();
  857.             List<BigInteger> M = new List<BigInteger>();
  858.             U.Add(R);
  859.             M.Add(p);
  860.             do
  861.             {
  862.                 M.Add((U[i] * U[i] + D) / M[i]);
  863.                 U.Add(BigInteger.Min(U[i] % M[i + 1], M[i + 1] - U[i] % M[i + 1]));
  864.                 i++;
  865.             } while (M[i] != 1);
  866.             i--;
  867.             List<BigInteger> a = new List<BigInteger>();
  868.             List<BigInteger> b = new List<BigInteger>();
  869.             for (int j = 0; j <= i; j++)
  870.             {
  871.                 a.Add(0);
  872.                 b.Add(0);
  873.             }
  874.             a[i] = U[i];
  875.             b[i] = 1;
  876.             while (i != 0)
  877.             {
  878.                 BigInteger znamenatel = a[i] * a[i] + D * b[i] * b[i];
  879.                 if ((U[i - 1] * a[i] + D * b[i]) % znamenatel == 0)
  880.                     a[i - 1] = (U[i - 1] * a[i] + D * b[i]) / znamenatel;
  881.                
  882.                 else
  883.                     a[i - 1] = (-U[i - 1] * a[i] + D * b[i]) / znamenatel;
  884.                
  885.                 if ((-a[i] + U[i - 1] * b[i]) % znamenatel == 0)
  886.                     b[i - 1] = (-a[i] + U[i - 1] * b[i]) / znamenatel;
  887.                 else
  888.                     b[i - 1] = (-a[i] - U[i - 1] * b[i]) / znamenatel;
  889.                
  890.                 i--;
  891.             }
  892.             List<BigInteger> answer = new List<BigInteger>();
  893.             answer.Add(a[0]);
  894.             answer.Add(b[0]);
  895.             return answer;
  896.         }
  897.         public static bool CheckQuadraticResidue(BigInteger A, BigInteger p) =>
  898.         BigInteger.ModPow(A, (p - 1) / 2, p) == 1;
  899.         private static void CheckA(ref bool t, ref BigInteger k, int n)
  900.         {
  901.             if (NR_[0] == NR_[1] * n)
  902.             {
  903.                 for (BigInteger i = k; ; i++)
  904.                 {
  905.                     if (i > 1000000)
  906.                     {
  907.                         t = false;
  908.                         break;
  909.                     }
  910.                     bool flag = CheckQuadraticResidue((i + 1) % p, NR_[0]);
  911.                     if (n == 4 && flag || n == 2 && !flag)
  912.                     {
  913.                         A = i;
  914.                         k = A + 1;
  915.                         break;
  916.                     }
  917.                 }
  918.             }
  919.         }
  920.         private static List<BigInteger> NR_function(BigInteger a, BigInteger b, BigInteger p)
  921.         {
  922.             List<BigInteger> T = new List<BigInteger>();
  923.             T.Add(b * (-2));
  924.             T.Add(a * 2);
  925.             T.Add(b * 2);
  926.             T.Add(a * (-2));
  927.             for (int i = 0; i < T.Count; i++)
  928.             {
  929.                 T[i] += (1 + p);
  930.  
  931.                 if ((T[i] % 2).Equals(0) && IsPrime((T[i] / 2)))
  932.                     return new List <BigInteger>() {T[i],T[i] / 2};
  933.                
  934.                 else
  935.                     if ((T[i] % 4).Equals(0) && IsPrime((T[i] / 4)))
  936.                         return new List <BigInteger>() {T[i],T[i] / 4};
  937.             }
  938.             return new List <BigInteger>();
  939.         }
  940.  
  941.          public static List<BigInteger> SumPoints(List<BigInteger> P1, List<BigInteger> P2, BigInteger A, BigInteger p)
  942.         {
  943.             List <BigInteger> answer = new List <BigInteger>();
  944.             BigInteger x1 = P1[0],y1 = P1[1], x2 = P2[0], y2 = P2[1], alpha;
  945.             if (x1 == x2 && y1 == y2)
  946.             {
  947.                 BigInteger numerator = (3 * x1 * x1 + A) % p, denomerator = (2 * y1) % p;
  948.                 if (denomerator == 0)
  949.                     return answer;
  950.                 alpha = numerator * ReverseElement(denomerator, p) % p;
  951.             }
  952.             else
  953.             {
  954.                 BigInteger numerator = (y2 - y1) % p, denomerator = (x2 - x1) % p;
  955.                 denomerator = denomerator >= 0 ? denomerator : denomerator + p;
  956.                 if (denomerator == 0)
  957.                     return answer;
  958.                 alpha = numerator * ReverseElement(denomerator, p) % p;
  959.             }
  960.             BigInteger xr = (alpha * alpha - x1 - x2) % p, yr = (-y1 + alpha * (x1 - xr)) % p;
  961.             xr = xr >= 0 ? xr : xr + p;
  962.             yr = yr >= 0 ? yr : yr + p;
  963.             answer.Add(xr);
  964.             answer.Add(yr);
  965.             return answer;
  966.         }
  967.         public static string c10to2(BigInteger i)
  968.         {
  969.             string s = "";
  970.             while (i > 0) { s = (i % 2).ToString() + s; i /= 2; }
  971.             return s == "" ? "0" : s;
  972.         }
  973.          private static int CountBit(BigInteger P)
  974.         {
  975.             int count = 0;
  976.             while (P > 0)
  977.             {
  978.                 P >>= 1;
  979.                 count++;
  980.             }
  981.             return count;
  982.         }
  983.         private static List <BigInteger> QuickSumPoint(List<BigInteger> P, BigInteger cnt, BigInteger A, BigInteger p)
  984.         {
  985.             BigInteger lengthBase = CountBit(cnt);
  986.             string c = c10to2(cnt);
  987.             char[] b = c.ToCharArray();
  988.             Array.Reverse(b);
  989.             c = new string(b);
  990.             List<List<BigInteger>> basePoints = new List<List<BigInteger>>();
  991.             List<List<BigInteger>> result = new List<List<BigInteger>>();
  992.             basePoints.Add(P);
  993.             int k = 0;
  994.             for (BigInteger i = 1; i <= cnt; i *= 2)
  995.             {
  996.                 if (!basePoints[k].Any())
  997.                 {
  998.                     break;
  999.                 }
  1000.                 else
  1001.                 {
  1002.                     basePoints.Add(SumPoints(basePoints[k], basePoints[k], A, p));
  1003.                 }
  1004.  
  1005.                 if (c[k] == '1')
  1006.                 {
  1007.                     result.Add(basePoints[k]);
  1008.                 }
  1009.                 k++;
  1010.             }
  1011.  
  1012.             if (!result.Any())
  1013.                 return new List <BigInteger>();
  1014.             List <BigInteger> resultPoint = result[0];
  1015.  
  1016.             for (int i = 1; i < result.Count; i++)
  1017.             {
  1018.                 if (!resultPoint.Any())
  1019.                     resultPoint = result[i];
  1020.                 else
  1021.                     resultPoint = SumPoints(resultPoint, result[i], A, p);
  1022.             }
  1023.  
  1024.             return resultPoint;
  1025.         }
  1026.         static void Main(string[] args)
  1027.         {
  1028.             while (true)
  1029.             {
  1030.                 step11:
  1031.                 Start();
  1032.                 int mode;
  1033.                 try
  1034.                 {
  1035.                     mode = int.Parse(Console.ReadLine());
  1036.                 }
  1037.                 catch (FormatException)
  1038.                 {
  1039.                     continue;
  1040.                 }
  1041.                 //Console.Clear();
  1042.                 try
  1043.                 {
  1044.                     switch (mode)
  1045.                     {
  1046.                         case 1:
  1047.                             {
  1048.                                 File.Delete("cnt.txt");
  1049.                                 cnt = 0;
  1050.                                 try
  1051.                                 {
  1052.                                     l = int.Parse(File.ReadAllText("l.txt"));
  1053.                                     DeleteFiles();
  1054.                                     try
  1055.                                     {
  1056.                                         using (var write = new StreamWriter(File.Open("l.txt", FileMode.OpenOrCreate)))
  1057.                                         {
  1058.                                             write.WriteLine(l);
  1059.                                         }
  1060.                                     }
  1061.                                     catch (FileNotFoundException)
  1062.                                     {
  1063.                                         throw new FileNotFoundException();
  1064.                                     }
  1065.                                     GenerateEC();
  1066.                                     Console.ReadLine();
  1067.                                     //Console.Clear();
  1068.                                     break;
  1069.                                 }
  1070.                                 catch
  1071.                                 {
  1072.                                     GenerateEC();
  1073.                                     Console.ReadLine();
  1074.                                     //Console.Clear();
  1075.                                     break;
  1076.                                 }
  1077.                                
  1078.                             }
  1079.                         case 2:
  1080.                             {
  1081.                                 File.Delete("cnt.txt");
  1082.                                 cnt = 0;
  1083.                                 try
  1084.                                 {
  1085.                                     Q.Clear();
  1086.                                     ReadOptions();
  1087.                                     DeleteFiles();
  1088.                                     WriteToFiles2(Q);
  1089.                                     GenerateL();
  1090.                                     Console.ReadLine();
  1091.                                     //Console.Clear();
  1092.                                     break;
  1093.                                 }
  1094.                                 catch
  1095.                                 {
  1096.                                     GenerateL();
  1097.                                     Console.ReadLine();
  1098.                                     //Console.Clear();
  1099.                                     break;
  1100.                                 }
  1101.                             }
  1102.                         case 3:
  1103.                             {
  1104.                                 Protocol();
  1105.                                 if(!flag2)
  1106.                                     return;
  1107.                                 Console.ReadLine();
  1108.                                 //Console.Clear();
  1109.                                 break;
  1110.                             }
  1111.                         case 0:
  1112.                             {
  1113.                                 return;
  1114.                             }
  1115.                         default:
  1116.                             break;
  1117.                     }
  1118.                 }
  1119.                 catch (FileNotFoundException)
  1120.                 {
  1121.                     Console.WriteLine("Ошибка! Нет параметров эллиптической кривой!");
  1122.                     Console.ReadLine();
  1123.                     goto step11;
  1124.                 }
  1125.             }
  1126.         }
  1127.     }
  1128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement