/// <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); }
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)); }
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))); }
/// <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]); }