Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
        }
Beispiel #5
0
        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));
        }