public void Extensions_Parse_Should_Return_The_Same_Result_Like_Internal_BigInteger_Parse(string number)
        {
            var left  = BigIntegerExtensions.Parse(number).ToString();
            var right = BigInteger.Parse(number).ToString();

            Assert.AreEqual(left, right);
        }
Exemple #2
0
        public static void GenerateTwoPrimesMultipleNumbersInFile(string path, int dividerSize)
        {
            var topBound    = BigInteger.Pow(10, dividerSize);
            var bottonBound = BigInteger.Pow(10, dividerSize - 1);

            BigInteger GetSizedRandomPrime()
            {
                BigInteger number = 0;

                while (number >= topBound || number <= bottonBound)
                {
                    var randomNumber = BigIntegerExtensions.GetNextRandom(Random, BigInteger.Pow(10, dividerSize));
                    number = BigIntegerExtensions.NextPrimaryMillerRabin(randomNumber);
                }

                return(number);
            }

            var semiPrimeNumbers = new List <string>();

            for (var i = 0; i < NumbersCountForDimension; i++)
            {
                var first     = GetSizedRandomPrime();
                var second    = GetSizedRandomPrime();
                var semiPrime = first * second;
                semiPrimeNumbers.Add(semiPrime.ToString());
            }

            File.WriteAllLines(path, semiPrimeNumbers);
        }
Exemple #3
0
        private void GenRSAKeys(object sender, RoutedEventArgs e)
        {
            prog.IsIndeterminate  = true;
            GenRSAKeysB.IsEnabled = false;
            SenderPath            = Environment.CurrentDirectory + @"\Sender";
            if (Directory.Exists(SenderPath))
            {
                Directory.Delete(SenderPath, true);
            }
            Directory.CreateDirectory(SenderPath);
            var bw = new BackgroundWorker();

            bw.DoWork += delegate
            {
                var keys = BigIntegerExtensions.GenRSAValues(16);
                this.keys = keys;
                File.WriteAllLines(SenderPath + @"\open_key.txt", new string[]
                {
                    string.Join(" ", keys.Item1.ToByteArray().Select(a => a.ToString("X"))),
                    string.Join(" ", keys.Item2.ToByteArray().Select(a => a.ToString("X")))
                });
                File.WriteAllLines(SenderPath + @"\close_key.txt", new string[]
                {
                    string.Join(" ", keys.Item3.ToByteArray().Select(a => a.ToString("X"))),
                    string.Join(" ", keys.Item4.ToByteArray().Select(a => a.ToString("X")))
                }); Dispatcher.Invoke(new Action(() =>
                {
                    MessageBox.Show("Открытый ключ - open_key.txt, Закрытый ключ - close_key.txt");
                    prog.IsIndeterminate    = false;
                    GenRSAKeysB.IsEnabled   = true;
                    SendCloseKeyB.IsEnabled = true;
                }));
            };
            bw.RunWorkerAsync();
        }
Exemple #4
0
        public void TestGetPasswordAuthenticationKey()
        {
            string username = "******";
            string password = "******";
            string poolName = "Pj8nlkpKR";

            byte[] bytes = new byte[1024];
            for (int i = bytes.Length - 1; i > 0; i--)
            {
                bytes[i] = 2;
            }
            BigInteger a = new BigInteger(bytes);
            BigInteger A = BigInteger.ModPow(AuthenticationHelper.g, a, AuthenticationHelper.N);
            Tuple <BigInteger, BigInteger> tupleAa = Tuple.Create <BigInteger, BigInteger>(A, a);
            string srpb = "8d340308265ada665b1b2c730fb65ff0b6dc746b63c2d7e9f08b8aa9306d4848268bc0c17ee4a2999173ca62af59fd74b"
                          + "a5d00f16c96bea082b163f2c3a0b745455d62cb9577425b4b5d4dadba163a8e7759a7c0256795f464682770588c84e82f2c63d47017"
                          + "51476da8e8a7b1a131e78560fe7b56b6761fcef88dcc486f403369a0cac2f04c25ed6d5e08b5a2f488500a0d5af4972cfa1213bfca3"
                          + "7bbae189c8d58465b13193204f21ea01d267c7688e6e6cb5d3f5a8005db680d272308ee823816032dd2c8fc3b95b6fd0a742feb127e"
                          + "3d094cd002a5e6b209415ff82f6abf50d5da43910a0336e9a6fc33dd101bf13f22f13fcb3ea3809aae4917d7c426fb8c0a894030c75"
                          + "d3e15f0e1078a9d89e5154391cde6111ac14fab9fa3b3a880da7dbd47fd5a055937581d26b5d225c076e82f980dcbd77b3950d270d8"
                          + "b622dca9c9bcd8fd6435a59b9690b3c9e2bdabf58cae3420c19066abc420145b1b66f226a6493c96588c2d53b637798fcaa573379f2"
                          + "251848065fe1fafb68ed5e79135e9";
            BigInteger B    = BigIntegerExtensions.FromUnsignedLittleEndianHex(srpb);
            BigInteger salt = BigIntegerExtensions.FromUnsignedLittleEndianHex("b704a27deb8cf5efec43a40eac5b60d2");

            byte[] key        = AuthenticationHelper.GetPasswordAuthenticationKey(username, password, poolName, tupleAa, B, salt);
            string testKey    = Convert.ToBase64String(key);
            string correctKey = "LmbBsy/4chqMRYOhmtmCrA==";

            Assert.Equal(correctKey, testKey);
        }
        public static void GetAllPoints()
        {
            BigInteger fieldOrder = BigInteger.Parse("113") * BigInteger.Parse("19");
            BigInteger x, y, d;
            var        random = new Random();

            do
            {
                x = BigIntegerExtensions.GetNextRandom(random, fieldOrder);
                y = BigIntegerExtensions.GetNextRandom(random, fieldOrder);
                d = ((x * x + y * y - 1) * (x * x * y * y).Inverse(fieldOrder)).Mod(fieldOrder);
            } while (d == 1 || d == 0);

            //     d = 1;
            Console.WriteLine($"x = {x}");
            Console.WriteLine($"y = {y}");

            var edwardsCurve = new AffineEdwardsCurve(d, fieldOrder);

            Console.WriteLine(edwardsCurve);

            var pointsFactory = new PointsFactory(edwardsCurve);

            var points = new List <AffineEdwardsCurvePoint>();

            for (var x1 = 0; x1 < fieldOrder; x1++)
            {
                for (var y1 = 0; y1 < fieldOrder; y1++)
                {
                    if (!pointsFactory.SoftCheckPointOnCurve(x1, y1))
                    {
                        continue;
                    }

                    points.Add(pointsFactory.CreatePoint(x1, y1));
                }
            }

            Console.WriteLine("Edwards curve has " + points.Count + " points");

            var calculator = new AffineEdwardsCurvePointCalculator();
            var pairs      = points.Join(points, p1 => 1, p2 => 1, (p1, p2) => new { p1, p2 }).ToArray();

            try
            {
                var sumPoints = pairs.AsParallel().Select(pair => calculator.Sum(pair.p1, pair.p2));
                Console.WriteLine("Sums were calculated without any exception. Sums count:" + sumPoints.Count());
            }
            catch (AggregateException e)
            {
                var gcdFoundException = e.InnerExceptions.First() as GcdFoundException;
                if (gcdFoundException == null)
                {
                    throw;
                }

                Console.WriteLine(gcdFoundException.Message);
                Console.WriteLine(gcdFoundException.GreatestCommonDivisor);
            }
        }
Exemple #6
0
        private int countPointInner(long start, long end)
        {
            var count = 0;
            var pLong = (long)p;

            if (end >= pLong)
            {
                end = pLong;
            }
            for (long x = start; x < end; x++)
            {
                var z = (long)ExtraBigIntegerExtensions.Mod(x * x * x + a * x + b, p);
                if (z == 0)
                {
                    count++;
                }
                else
                {
                    var legendreSymbol = BigIntegerExtensions.jacobi(z, pLong);
                    if (legendreSymbol == 1)
                    {
                        count += 2;
                    }
                }
            }

            return(count);
        }
Exemple #7
0
        public void InitializeParameters()
        {
            millerRabin = new MillerRabin();
            BigInteger p = millerRabin.GetRandomPrime(KeySize / 8);
            BigInteger q = millerRabin.GetRandomPrime(KeySize / 8);


            BigInteger fi = (p - 1) * (q - 1);
            BigInteger e  = millerRabin.GetRandomPrime(fi);

            BigInteger d        = BigIntegerExtensions.ModInverse(e, fi);
            BigInteger inverseQ = BigIntegerExtensions.ModInverse(q, p);
            BigInteger dp       = d % (p - 1);
            BigInteger dq       = d % (q - 1);

            rsaParameters = new RsaParameters
            {
                P        = p,
                Q        = q,
                Modulus  = (p * q),
                Exponent = e,
                Dp       = dp,
                Dq       = dq,
                InverseQ = inverseQ,
                D        = d
            };
        }
        public void ShouldCreateUnsignedBigIntegerFrom4NegativeBytes()
        {
            byte[]     bytes  = { 0xFF, 0xFF, 0xFF, 0xFF }; // 4294967295 unsigned, -1 signed (little endian)
            BigInteger result = BigIntegerExtensions.UnsignedFromBytes(bytes);

            AssertBigIntegerEqual(4294967295L, result);
        }
 public void ShouldConvertValuesToExtremeMathematics()
 {
     byte[][] testBytes =
     {
         // Little endian
         new byte[] {  127 },
         new byte[] {  255 },
         new byte[] {0xFF, 0xFF, 0x7F },
         new byte[] {0xFF, 0xFF, 0xFF },
         new byte[] {0xFF, 0xFF, 0xFF, 0x7F },
         new byte[] {0xFF, 0xFF, 0xFF, 0xFF }
     };
     foreach (var bytes in testBytes)
     {
         BigInteger value = new BigInteger(bytes);
         if (value.Sign < 0)
         {
             Assert.Throws <ArgumentException>(() => BigIntegerExtensions.ToUnsignedExtremeMathematics(value));
         }
         else
         {
             Assert.AreEqual(value.ToString(),
                             BigIntegerExtensions.ToUnsignedExtremeMathematics(value).ToString());
         }
     }
 }
        public void ShouldCreateUnsignedBigIntegerFromNegativeByte()
        {
            byte[]     bytes  = { 255 }; // 255 unsigned, -1 signed
            BigInteger result = BigIntegerExtensions.UnsignedFromBytes(bytes);

            AssertBigIntegerEqual(255, result);
        }
        public void ShouldCreateUnsignedBigIntegerFrom4PositiveBytes()
        {
            byte[]     bytes  = { 0xFF, 0xFF, 0xFF, 0x7F }; // 2147483647 (little endian)
            BigInteger result = BigIntegerExtensions.UnsignedFromBytes(bytes);

            AssertBigIntegerEqual(2147483647, result);
        }
Exemple #12
0
        private byte[] XorKeySizePadding(BigInteger cipheredAgainPreviousBlock, BigInteger block)
        {
            byte[] xorResult = BigIntegerExtensions.UnsignedToBytes(cipheredAgainPreviousBlock ^ block);
            int    keySize   = rsa.ExportParameters().Modulus.Length;

            return(BlockCipherSupport.PadWithZeros(xorResult, keySize));
        }
        public void ShouldCreateUnsignedBigIntegerFromPositiveByte()
        {
            byte[]     bytes  = { 127 };
            BigInteger result = BigIntegerExtensions.UnsignedFromBytes(bytes);

            AssertBigIntegerEqual(127, result);
        }
 public void ShouldConvertBigIntegerWithSignByteToUnsignedBytes()
 {
     BigInteger[] testValues =
     {
         128,
         170,
         255,
         32768,
         33940,
         65535,
         4294967295
     };
     byte[][] expectedValues =
     {
         // Little endian
         new byte[] {  128 },
         new byte[] {  170 },
         new byte[] {  255 },
         new byte[] {0x00, 0x80 },
         new byte[] {0x94, 0x84 },
         new byte[] {0xFF, 0xFF },
         new byte[] {0xFF, 0xFF, 0xFF, 0xFF }
     };
     for (int i = 0; i < testValues.Length; i++)
     {
         Assert.AreEqual(expectedValues[i], BigIntegerExtensions.UnsignedToBytes(testValues[i]));
     }
 }
        private void Calc(int secretKey)
        {
            const double scale_f = 1e50;
            BigInteger   p       = BigInteger.Parse("115792089237316195423570985008687907853269984665640564039457584007908834671663");
            float        scale_p = (float)((double)p / scale_f);
            // Elliptic curve: y^2 = x^3 + a*x + b (mod p): y^2 = x^3 + 7
            BigInteger a = 0;
            BigInteger b = 7;
            // P = G
            var G = new EcModPoint
            {
                x = BigInteger.Parse("55066263022277343669578718895168534326250603453777594175500187360389116729240"),
                y = BigInteger.Parse("32670510020758816978083085130507043184471273380659243275938904335757337482424")
            };


            var lstPoints = BigIntegerExtensions.EcSlowPointListByAddition(p, a, G, secretKey);

            var g = pbEcDescrete.CreateGraphics();

            g.FillRectangle(Brushes.White, new RectangleF(0, 0, pbEcDescrete.Width, pbEcDescrete.Height));

            foreach (var ecPoint in lstPoints)
            {
                var x       = (float)((double)ecPoint.x / scale_f);
                var y       = (float)((double)ecPoint.y / scale_f);
                var scale_x = pbEcDescrete.Width / scale_p;
                var scale_y = pbEcDescrete.Height / scale_p;
                var x1      = scale_x * x;
                var y1      = scale_y * y;

                g.FillRectangle(Brushes.Blue, new RectangleF(x1, y1, 3F, 3F));
            }
        }
Exemple #16
0
        public static void Main(string[] args)
        {
            var       random            = new Random();
            var       listOfEc          = new List <EllepticCurve>();
            const int curvesCountPerDim = 100;

            for (var pDim = 2; pDim < 10; pDim++)
            {
                var dimen = BigInteger.Pow(10, pDim);
                for (var i = 0; i < curvesCountPerDim; i++)
                {
                    dimen = BigIntegerExtensions.NextPrimaryMillerRabin(dimen);
                    var a  = BigIntegerExtensions.GetNextRandom(random, dimen);
                    var b  = BigIntegerExtensions.GetNextRandom(random, dimen);
                    var ec = new EllepticCurve(a, b, dimen);
                    listOfEc.Add(ec);
                }
            }

            foreach (var curve in listOfEc)
            {
                var pointsCount = curve.CountPoints;
                var b1          = curve.LenstraEdges.B1;

                var dim  = curve.p.ToString().Length;
                var info = $"{dim}\t{curve.a}\t{curve.b}\t{curve.p}\t{pointsCount}\t{b1}\t\r\n";
                File.AppendAllText(CurvesWithItsBAndPointsCountTxt, info);
            }
        }
Exemple #17
0
        private byte[] ModPow(byte[] data, BigInteger exponent)
        {
            BigInteger modulus        = BigIntegerExtensions.UnsignedFromBytes(parameters.Modulus);
            BigInteger dataBigInteger = BigIntegerExtensions.UnsignedFromBytes(data);
            BigInteger result         = BigInteger.ModPow(dataBigInteger, exponent, modulus);

            return(BigIntegerExtensions.UnsignedToBytes(result));
        }
Exemple #18
0
        public MInteger(string representation)
        {
            CreateBitList();
            BigInteger big          = BigInteger.Parse(representation);
            string     binaryString = BigIntegerExtensions.ToBinaryString(big);

            AppendBinaryString(binaryString);
        }
        private static void encodeNumeric(String msg, int startpos, int count, StringBuilder sb)
        {
#if SILVERLIGHT4 || SILVERLIGHT5 || NET40 || NET45 || NETFX_CORE
            int           idx    = 0;
            StringBuilder tmp    = new StringBuilder(count / 3 + 1);
            BigInteger    num900 = new BigInteger(900);
            BigInteger    num0   = new BigInteger(0);
            while (idx < count - 1)
            {
                tmp.Length = 0;
                int    len  = Math.Min(44, count - idx);
                String part = '1' + msg.Substring(startpos + idx, len);
#if SILVERLIGHT4 || SILVERLIGHT5
                BigInteger bigint = BigIntegerExtensions.Parse(part);
#else
                BigInteger bigint = BigInteger.Parse(part);
#endif
                do
                {
                    BigInteger c = bigint % num900;
                    tmp.Append((char)c);
                    bigint = BigInteger.Divide(bigint, num900);
                } while (!bigint.Equals(num0));

                //Reverse temporary string
                for (int i = tmp.Length - 1; i >= 0; i--)
                {
                    sb.Append(tmp[i]);
                }
                idx += len;
            }
#else
            int           idx    = 0;
            StringBuilder tmp    = new StringBuilder(count / 3 + 1);
            BigInteger    num900 = new BigInteger(900);
            BigInteger    num0   = new BigInteger(0);
            while (idx < count - 1)
            {
                tmp.Length = 0;
                int        len    = Math.Min(44, count - idx);
                String     part   = '1' + msg.Substring(startpos + idx, len);
                BigInteger bigint = BigInteger.Parse(part);
                do
                {
                    BigInteger c = BigInteger.Modulo(bigint, num900);
                    tmp.Append((char)c.GetHashCode());
                    bigint = BigInteger.Division(bigint, num900);
                } while (!bigint.Equals(num0));

                //Reverse temporary string
                for (int i = tmp.Length - 1; i >= 0; i--)
                {
                    sb.Append(tmp[i]);
                }
                idx += len;
            }
#endif
        }
Exemple #20
0
        private void TestFromBigEndianPositive(int number, byte[] expectedBigEndianByteArray, int expectedFromBigEndianPositvie)
        {
            var biNumber                = new BigInteger(number);
            var bigEndianByteArray      = biNumber.ToBigEndianByteArray();
            var biFromBigEndianPositive = BigIntegerExtensions.FromUnsignedBigEndian(bigEndianByteArray);

            Assert.True(expectedBigEndianByteArray.SequenceEqual(bigEndianByteArray));
            Assert.Equal(expectedFromBigEndianPositvie, biFromBigEndianPositive);
        }
Exemple #21
0
        /// <summary> Символ Лежандра </summary>
        public static void LegendreSymbol()
        {
            int a = 27;
            int p = 23;

            Console.WriteLine("a = " + a);
            Console.WriteLine("p = " + p);
            Console.WriteLine("(a/p) = {0}", BigIntegerExtensions.Jacobi(a, p));;
        }
Exemple #22
0
        public byte[] Decrypt(byte[] data)
        {
            if (data.Length == 0)
            {
                return(data);
            }

            BigInteger d = BigIntegerExtensions.UnsignedFromBytes(parameters.D);

            return(ModPow(data, d));
        }
Exemple #23
0
        public byte[] Encrypt(byte[] data)
        {
            if (data.Length == 0)
            {
                return(data);
            }

            BigInteger exponent = BigIntegerExtensions.UnsignedFromBytes(parameters.Exponent);

            return(PadWithZeroes(ModPow(data, exponent))); // Pad in case result is shorter than key
        }
Exemple #24
0
        private static BigInteger RandomPrime(int numberOfBits)
        {
            BigInteger result;

            do
            {
                result = BigIntegerExtensions.Random(numberOfBits);
            } while (!result.IsProbablyPrime(256));

            return(result);
        }
Exemple #25
0
        public KeyPair GenerateKeyPair(BigInteger p, BigInteger q, BigInteger e)
        {
            BigInteger n   = p * q,
                       phi = (p - 1) * (q - 1),
                       d   = BigIntegerExtensions.ModInverse(e, phi);

            return(new KeyPair(
                       new PublicKey(e, n),
                       new PrivateKey(d, n)
                       ));
        }
Exemple #26
0
        private BigInteger CalculatePreviousXor(List <byte[]> decipheredBlocks, int i, List <byte[]> cipheredBlocks)
        {
            if (i > 0)
            {
                var previousDecipheredBlock = BigIntegerExtensions.UnsignedFromBytes(decipheredBlocks[i - 1]);
                var previousCipheredBlock   = BigIntegerExtensions.UnsignedFromBytes(cipheredBlocks[i - 1]);
                return(previousCipheredBlock ^ previousDecipheredBlock);
            }

            return(InitializationVector);
        }
        public static CurvePoint BitCoinGenerator()
        {
            var curve = EllypticCurve.CreateWeierstrass(0, 7, Configurations.MathConfiguration.GenerateSECP256K1());

            var g = new Point(
                BigInteger.Parse("55066263022277343669578718895168534326250603453777594175500187360389116729240"),
                BigInteger.Parse("32670510020758816978083085130507043184471273380659243275938904335757337482424"));

            return(new CurvePoint(curve, g,
                                  BigIntegerExtensions.FromBigEndianHexString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141")));
        }
        private static string GenerateSafePrime()
        {
            var random = new Random();
            var bitInt = BigIntegerExtensions.GenerateSafePrime(SafePrimeLength, 1, random);

            while (!bitInt.IsSafePrime(100))
            {
                bitInt = BigIntegerExtensions.GenerateSafePrime(SafePrimeLength, 1, random);
            }
            return(bitInt.ToString("X2"));
        }
Exemple #29
0
        /// <summary> Разложение </summary>
        public static void Factorize()
        {
            BigInteger n        = BigInteger.Parse("123456794568413263") * BigInteger.Parse("256783548123456833");
            var        pRs      = BigIntegerExtensions.Factorize <ClassicLenstra>(n).OrderBy(x => x.Key);
            var        nRecover = BigInteger.One;

            foreach (var pR in pRs)
            {
                nRecover *= BigInteger.Pow(pR.Key, pR.Value);
            }
            var eq = n == nRecover;
        }
        public void ShouldGenerateUnsignedRandomBigIntegers()
        {
            int numberOfBits = 512;

            for (int i = 0; i < 1000; i++)
            {
                BigInteger random      = BigIntegerExtensions.Random(numberOfBits);
                int        arrayLength = random.ToByteArray().Length * 8;
                Assert.AreEqual(numberOfBits + 8, arrayLength); // Include sign bit for 512 bit values
                Assert.AreEqual(1, random.Sign);
            }
        }