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 }