예제 #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);
        }
        private static FiniteFieldPoint AdjustPoint(int totalPoints, FiniteFieldPoint point) {
            var correction = new FiniteFieldPolynomial(point.Y.PrimePolynomial, BigInteger.One);
            var correctionMultiplier = point.X;

            for (int i = 1; i <= totalPoints; i++) {
                correction = correction*correctionMultiplier;
            }

            var newY = point.Y + correction;
            return new FiniteFieldPoint(point.X, newY);
        }
        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));
        }
예제 #4
0
        private static FiniteFieldPoint AdjustPoint(int totalPoints, FiniteFieldPoint point)
        {
            var correction           = new FiniteFieldPolynomial(point.Y.PrimePolynomial, BigInteger.One);
            var correctionMultiplier = point.X;

            for (int i = 1; i <= totalPoints; i++)
            {
                correction = correction * correctionMultiplier;
            }

            var newY = point.Y + correction;

            return(new FiniteFieldPoint(point.X, newY));
        }
        public static FiniteFieldPolynomial EvaluateAt(long x, FiniteFieldPolynomial[] coefficients) {
            // Use Horner's Scheme: http://en.wikipedia.org/wiki/Horner_scheme

            FiniteFieldPolynomial xAsPoly = coefficients[0].GetValueInField(x);

            // assume the coefficient for highest monomial is 1            
            FiniteFieldPolynomial result = xAsPoly.Clone();

            for (int i = coefficients.Length - 1; i > 0; i--) {
                result = result + coefficients[i];
                result = result*xAsPoly;
            }

            result = result + coefficients[0];

            return result;
        }
예제 #6
0
        public static FiniteFieldPolynomial EvaluateAt(long x, FiniteFieldPolynomial[] coefficients)
        {
            // Use Horner's Scheme: http://en.wikipedia.org/wiki/Horner_scheme

            FiniteFieldPolynomial xAsPoly = coefficients[0].GetValueInField(x);

            // assume the coefficient for highest monomial is 1
            FiniteFieldPolynomial result = xAsPoly.Clone();

            for (int i = coefficients.Length - 1; i > 0; i--)
            {
                result = result + coefficients[i];
                result = result * xAsPoly;
            }

            result = result + coefficients[0];

            return(result);
        }
예제 #7
0
        internal static bool TryParse(Match match, out FiniteFieldPoint result)
        {
            if (!match.Success)
            {
                result = null;
                return(false);
            }

            try {
                var xString = match.Groups["x"].Value.ToLowerInvariant();
                var yString = match.Groups["y"].Value.ToLowerInvariant();

                // get rid of any initial 0's
                while (xString.StartsWith("0", StringComparison.Ordinal))
                {
                    xString = xString.Substring(1);
                }

                // Each hex letter makes up 4 bits, so to get the degree in bits
                // we multiply by 4

                int polynomialDegree = yString.Length * 4;

                var irp = new IrreduciblePolynomial(polynomialDegree);

                var x = new FiniteFieldPolynomial(irp, BigInteger.Parse(xString));

                // get bytes
                var bigEndianBytes = new byte[yString.Length / 2];
                for (int i = 0; i < yString.Length; i += 2)
                {
                    bigEndianBytes[i / 2] = Byte.Parse(yString.Substring(i, 2), NumberStyles.HexNumber);
                }
                var y = new FiniteFieldPolynomial(irp, bigEndianBytes.ToBigIntegerFromBigEndianUnsignedBytes());

                result = new FiniteFieldPoint(x, y);
                return(true);
            }
            catch (Exception exception) {
                result = null;
                return(false);
            }
        }
        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));
        }
예제 #9
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));
 }
예제 #10
0
 public SplitSecret(SecretShareType shareType, int threshold, IrreduciblePolynomial irreduciblePolynomial, FiniteFieldPolynomial[] allCoefficients, SecureString passPhrase = null)
 {
     _ShareType = shareType;
     Threshold = threshold;
     _IrreduciblePolynomial = irreduciblePolynomial;
     _AllCoefficients = allCoefficients;
     _PassPhrase = passPhrase;
 }
예제 #11
0
        internal static bool TryParse(Match match, out FiniteFieldPoint result) {
            if (!match.Success) {
                result = null;
                return false;
            }

            try {
                var xString = match.Groups["x"].Value.ToLowerInvariant();
                var yString = match.Groups["y"].Value.ToLowerInvariant();

                // get rid of any initial 0's
                while (xString.StartsWith("0", StringComparison.Ordinal)) {
                    xString = xString.Substring(1);
                }

                // Each hex letter makes up 4 bits, so to get the degree in bits
                // we multiply by 4

                int polynomialDegree = yString.Length*4;

                var irp = new IrreduciblePolynomial(polynomialDegree);

                var x = new FiniteFieldPolynomial(irp, BigInteger.Parse(xString));

                // get bytes
                var bigEndianBytes = new byte[yString.Length/2];
                for (int i = 0; i < yString.Length; i += 2) {
                    bigEndianBytes[i/2] = Byte.Parse(yString.Substring(i, 2), NumberStyles.HexNumber);
                }
                var y = new FiniteFieldPolynomial(irp, bigEndianBytes.ToBigIntegerFromBigEndianUnsignedBytes());

                result = new FiniteFieldPoint(x, y);
                return true;
            }
            catch(Exception exception) {
                result = null;
                return false;
            }
        }
예제 #12
0
 public FiniteFieldPoint(FiniteFieldPolynomial x, FiniteFieldPolynomial y) {
     X = x;
     Y = y;
 }
예제 #13
0
 public FiniteFieldPoint(FiniteFieldPolynomial x, FiniteFieldPolynomial y)
 {
     X = x;
     Y = y;
 }