Advertisement
Guest User

Untitled

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