public static SplitSecret Split(SecretShareType shareType, byte[] secret, int threshold, Diffuser diffuser) { var irreduciblePolynomial = IrreduciblePolynomial.CreateOfByteSize(secret.Length); var rawSecret = secret.ToBigIntegerFromBigEndianUnsignedBytes(); var diffusedSecret = diffuser.Scramble(rawSecret, secret.Length); var secretCoefficient = new FiniteFieldPolynomial(irreduciblePolynomial, diffusedSecret); var allCoefficients = new[] { secretCoefficient } .Concat( GetRandomPolynomials( irreduciblePolynomial, threshold - 1) ) .ToArray(); var passPhrase = new SecureString(); try { foreach (var currentChar in secret.ToHexString()) { passPhrase.AppendChar(currentChar); } } catch { passPhrase = null; } if ((passPhrase == null) || (passPhrase.Length == 0)) { passPhrase = null; } return(new SplitSecret(shareType, threshold, irreduciblePolynomial, allCoefficients, passPhrase)); }
public SecretShare GetShare(int n) { var xPoly = new FiniteFieldPolynomial(_IrreduciblePolynomial, new BigInteger(n)); var y = FiniteFieldPolynomial.EvaluateAt(n, _AllCoefficients); return(new SecretShare(_ShareType, new FiniteFieldPoint(xPoly, y))); }
public void BasicTests() { var rijndaelPoly = new IrreduciblePolynomial(8); var a = new FiniteFieldPolynomial(rijndaelPoly, 6, 4, 1, 0); var b = new FiniteFieldPolynomial(rijndaelPoly, 7, 6, 3, 1); var product = a * b; // "a" and "b" are inverses, so their product is 1 Assert.AreEqual(1, (int)product.PolynomialValue); var g = new FiniteFieldPolynomial(rijndaelPoly, BigInteger.Parse("0e5", NumberStyles.HexNumber)); var p = new FiniteFieldPolynomial(rijndaelPoly, BigInteger.One); // g is a generator, so we should generate all values except 0 var vals = new HashSet <BigInteger> { p.PolynomialValue }; for (int i = 0; i < 255; i++) { p = p * g; vals.Add(p.PolynomialValue); } Assert.AreEqual(255, vals.Count); Assert.IsTrue(vals.Contains((p * g).PolynomialValue)); }
public void TestInverse() { var rijndaelPoly = new IrreduciblePolynomial(8); var a = new FiniteFieldPolynomial(rijndaelPoly, 6, 4, 1, 0); var expectedInverse = new FiniteFieldPolynomial(rijndaelPoly, 7, 6, 3, 1); var actualInverse = a.GetInverse(); Assert.AreEqual(expectedInverse.ToString(), actualInverse.ToString()); var productSanityCheck = a * actualInverse; Assert.IsTrue(productSanityCheck.One.Equals(productSanityCheck)); }
public static SplitSecret Split(byte[] secret, int threshold) { var irreduciblePolynomial = IrreduciblePolynomial.CreateOfByteSize(secret.Length); var rawSecret = secret.ToBigIntegerFromBigEndianUnsignedBytes(); var diffusedSecret = DefaultDiffuser.Scramble(rawSecret, secret.Length); var secretCoefficient = new FiniteFieldPolynomial(irreduciblePolynomial, diffusedSecret); var allCoefficients = new[] { secretCoefficient } .Concat( GetRandomPolynomials( irreduciblePolynomial, threshold - 1) ) .ToArray(); return(new SplitSecret(threshold, irreduciblePolynomial, allCoefficients)); }