public ParallelEncoding(BigInteger key, byte[][] mess, EllipticCurvePoint _publicB, EllipticCurvePoint g)
 {
     Key        = key;
     Message    = mess;
     PublicB    = _publicB;
     PointG     = g;
     lengthmess = mess.GetLength(0);
     Shifr      = new Shifr[lengthmess];
     // вычисление общей части шифрограммы
     kP = EllipticCurvePoint.Multiply(key, PointG);
     kP = EllipticCurvePoint.AffineCoords(kP);
     //Вычисление общего ключа
     kPublicB = EllipticCurvePoint.Multiply(Key, PublicB);
 }
        public ParallelDecoding(BigInteger key, Shifr[] shifr)
        {
            Key        = key;
            Sh         = shifr;
            lengtshifr = shifr.Count();
            Message    = new byte[lengtshifr][];

            // Вычисляем точку Key*K*pointG
            KeyPara1 = EllipticCurvePoint.Multiply(Key, shifr[0].PointA);
            // привод к аффиным координатам и смена знака координаты Y(Для вычитания)
            KeyPara1   = EllipticCurvePoint.AffineCoords(KeyPara1);
            KeyPara1.Y = -KeyPara1.Y;
            // конец
        }
        public static void createKey(string path, int typePoint)
        {
            EllipticCurvePoint       g   = new EllipticCurvePoint(typePoint);
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            byte[] _key = new byte[g.BlockSize];
            rng.GetBytes(_key);
            BigInteger key = new BigInteger(_key); // секрет

            if (key < 0)
            {
                key = -key;
            }
            ;

            rng.GetBytes(_key);
            BigInteger t = new BigInteger(_key); //Случайное число, для нахождения случайной точки

            if (t < 0)
            {
                t = -t;
            }
            ;
            int b;
            EllipticCurvePoint point       = g.SearchPoint(t, out b);
            EllipticCurvePoint publicPoint = EllipticCurvePoint.Multiply(key, point); // публичная точка

            #region openkey
            StringBuilder openkey = new StringBuilder();
            // определение типа кривой
            openkey.Append('1');
            if (typePoint == 192)
            {
                openkey.Append("00");
            }
            else if (typePoint == 256)
            {
                openkey.Append("01");
            }
            else if (typePoint == 384)
            {
                openkey.Append("10");
            }
            else if (typePoint == 521)
            {
                openkey.Append("11");
            }
            // cохранение publicPoint
            publicPoint = EllipticCurvePoint.AffineCoords(publicPoint);
            string pointstr = EllipticCurvePoint.CompressPoint(publicPoint);
            openkey.Append(Convert.ToString(Convert.ToByte(pointstr.Count() / 2), 2).FillWithZero(8)); // кол-во байт в сжатой точке
            openkey.Append(Additional.FromByteStrToBitStr(pointstr));
            // Сохранение point
            pointstr = EllipticCurvePoint.CompressPoint(point);
            openkey.Append(Convert.ToString(Convert.ToByte(pointstr.Count() / 2), 2).FillWithZero(8)); // кол-во байт в сжатой точке
            openkey.Append(Additional.FromByteStrToBitStr(pointstr));
            // Вывод piblicKey
            List <byte> q = new List <byte>();
            string      s = openkey.ToString();
            q.Add((byte)(s.Count() % 8));
            q.AddRange(s.ToByteList());
            File.WriteAllBytes(path + "\\" + Environment.MachineName + "_" + typePoint.ToString() + ".publickey", q.ToArray());
            #endregion
            #region closekey
            StringBuilder closekey = new StringBuilder();
            // определение типа кривой
            closekey.Append('1');
            if (typePoint == 192)
            {
                closekey.Append("00");
            }
            else if (typePoint == 256)
            {
                closekey.Append("01");
            }
            else if (typePoint == 384)
            {
                closekey.Append("10");
            }
            else if (typePoint == 521)
            {
                closekey.Append("11");
            }
            // сохранение ключа
            closekey.Append(Convert.ToString(Convert.ToByte(key.ToByteArray().Count()), 2).FillWithZero(8)); // кол-во байт в в ключе
            closekey.Append(Additional.FromByteStrToBitStr(key.ToByteArray()));
            // Сохранение point
            pointstr = EllipticCurvePoint.CompressPoint(point);
            closekey.Append(Convert.ToString(Convert.ToByte(pointstr.Count() / 2), 2).FillWithZero(8)); // кол-во байт в сжатой точке
            closekey.Append(Additional.FromByteStrToBitStr(pointstr));
            // Вывод piblicKey
            q = new List <byte>();
            s = closekey.ToString();
            q.Add((byte)(s.Count() % 8));
            q.AddRange(s.ToByteList());
            File.WriteAllBytes(path + "\\" + Environment.MachineName + "_" + typePoint.ToString() + ".privatekey", q.ToArray());
            #endregion
        }