コード例 #1
0
            /// <summary>
            ///     Осуществляет разделение ключа на несколько частей
            /// </summary>
            /// <param name="Key">Ключ, который необходимо разделить</param>
            /// <param name="CountOfFragments">Число фрагментов, на которые необходимо разделить ключ</param>
            /// <param name="module">Модуль, который будет определен исходя из ключа</param>
            /// <param name="Limit">Порог количества фрагментов, начиная с которого можно будет восстановить ключ</param>
            /// <returns>Массив наборов (x,y). x можно публиковать. y должен находиться в секрете.</returns>
            public static KeyValuePair <int, BigInteger>[] Share(BigInteger Key, int CountOfFragments,
                                                                 out BigInteger module,
                                                                 int Limit = -1)
            {
                if (Limit == -1)
                {
                    Limit = CountOfFragments;
                }
                module = GetBiggerRandomPrime(Key);

                //Вычислили модуль многочлена и знаем порог - пора генерировать многочлен.
                int[] coefs = new int[Limit];
                for (int i = 0; i < coefs.Length - 1; i++)
                {
                    coefs[i] = (int)RD.UniformDistribution(1, module - 1, 1)[0];
                }
                coefs[coefs.Length - 1] = (int)Key;
                Polynoms.ModularPolynom          sharepolynom = new Polynoms.ModularPolynom(coefs, (int)module);
                KeyValuePair <int, BigInteger>[] Keys         = new KeyValuePair <int, BigInteger> [CountOfFragments];
                for (int i = 1; i <= CountOfFragments; i++)
                {
                    Keys[i - 1] = new KeyValuePair <int, BigInteger>(i, (BigInteger)sharepolynom.GetValue(i));
                }
                return(Keys);
            }
コード例 #2
0
 private static Polynoms.ModularPolynom[] gcd(Polynoms.ModularPolynom First, Polynoms.ModularPolynom Second, Polynoms.ModularPolynom x, Polynoms.ModularPolynom y,
                                              Polynoms.ModularPolynom oldx, Polynoms.ModularPolynom oldy)
 {
     if (Second.Degree == 0)
     {
         return new[] { Second[0] == 0?First: Second, x, y }
     }
     ;
     Console.WriteLine($"{Second}\t\t\t{x}\t\t\t{y}\t\t\t{First/Second}");
     Polynoms.ModularPolynom q = First / Second;
     return(gcd(Second, First % Second, oldx - x * q, oldy - y * q, x, y));
 }
コード例 #3
0
 public static Polynoms.ModularPolynom[] GCD(Polynoms.ModularPolynom First, Polynoms.ModularPolynom Second)
 {
     return(gcd(First, Second, new Polynoms.ModularPolynom(new[] { 1 }, First.Module), new Polynoms.ModularPolynom(0, First.Module), new Polynoms.ModularPolynom(0, First.Module), new Polynoms.ModularPolynom(new[] { 1 }, First.Module)));
 }
コード例 #4
0
 /// <summary>
 /// Вычисляет НОД для многочленов.
 /// </summary>
 /// <param name="First"></param>
 /// <param name="Second"></param>
 /// <returns></returns>
 public static Polynoms.ModularPolynom GCDResult(Polynoms.ModularPolynom First, Polynoms.ModularPolynom Second)
 {
     Console.WriteLine($"{First}\t\t\t{new Polynoms.ModularPolynom(new[] { 1 }, First.Module)}\t\t\t{new Polynoms.ModularPolynom(0, First.Module)}\t\t\t-");
     return(gcd(First, Second, new Polynoms.ModularPolynom(0, First.Module), new Polynoms.ModularPolynom(new[] { 1 }, First.Module), new Polynoms.ModularPolynom(new[] { 1 }, First.Module), new Polynoms.ModularPolynom(0, First.Module))[0]);
 }