public static string OutShifr(Shifr[] sh) { StringBuilder outShifr = new StringBuilder(); outShifr.Append(Convert.ToString(sh.Count(), 2).FillWithZero(24)); // количество шифрограмм 3 байта в начале файла EllipticCurvePoint kP = sh[0].PointA; // точка kP string kPs = EllipticCurvePoint.CompressPoint(kP); outShifr.Append(Convert.ToString(Convert.ToByte(kPs.Count() / 2), 2).FillWithZero(8)); // кол-во байт в сжатой точке outShifr.Append(Additional.FromByteStrToBitStr(kPs)); for (int i = 0; i < sh.Count(); i++) // Главный цикл по всем шифрованным блокам { StringBuilder tempstr = new StringBuilder(); #region данные_о_корректировке tempstr.Append(Convert.ToString(Convert.ToByte(sh[i].Correct), 2).FillWithZero(5)); #endregion #region основная_точка string p = EllipticCurvePoint.CompressPoint(sh[i].PointB); tempstr.Append(Convert.ToString(Convert.ToByte(p.Count() / 2), 2).FillWithZero(8)); // кол-во байт в сжатой точке tempstr.Append(Additional.FromByteStrToBitStr(p)); #endregion outShifr.Append(Convert.ToString(Convert.ToInt32(tempstr.Length), 2).FillWithZero(16)); outShifr.Append(tempstr.ToString()); } return(outShifr.ToString()); }
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 }