/// <summary> /// Проверка ЭЦП на базе открытого ключа другой стороны /// </summary> /// <param name="dataStream">Поток данных.</param> /// <param name="signStream">ЭЦП.</param> /// <param name="publicKeyFromOtherPartyStream">Поток открытого ключа другой стороны.</param> /// <returns>Булевский флаг операции.</returns> public bool VerifySign(Stream dataStream, Stream signStream, Stream publicKeyFromOtherPartyStream) { if(!publicKeyFromOtherPartyStream.CanSeek) { throw new Exception("Cryforce::VerifySign() ==> Public key from other party stream can't seek!"); } // Ищем начало потоков... dataStream.SafeSeekBegin(); signStream.SafeSeekBegin(); publicKeyFromOtherPartyStream.SafeSeekBegin(); // Создаем сущность для работы с эллиптическими кривыми var ecdhP521 = new EcdhP521(null, null); // Возвращаем результат проверки ЭЦП bool result; try { // Осуществляем проверку ЭЦП... result = ecdhP521.VerifyData(dataStream, new StreamReader(signStream, Encoding.UTF8).ReadToEnd(), new StreamReader(publicKeyFromOtherPartyStream, Encoding.UTF8).ReadToEnd()); } catch { result = false; } // Уничтожаем секретные данные... ecdhP521.Clear(); // Возвращаем результат проверки ЭЦП return result; }
/// <summary> /// Генерирование симметричных ключей /// </summary> /// <param name="publicKeyFromOtherPartyStream">Поток открытого ключа другой стороны.</param> /// <param name="privateKeyStream">Поток своего закрытого ключа.</param> /// <param name="symmetricKey1">Симметричный ключ №1 (256 bit).</param> /// <param name="symmetricKey2">Симметричный ключ №2 (256 bit).</param> public void GetSymmetricKeys(Stream publicKeyFromOtherPartyStream, Stream privateKeyStream, out byte[] symmetricKey1, out byte[] symmetricKey2) { if(!publicKeyFromOtherPartyStream.CanSeek) { throw new Exception("Cryforce::GetSymmetricKeys() ==> Public key from other party stream can't seek!"); } if(!privateKeyStream.CanSeek) { throw new Exception("Cryforce::GetSymmetricKeys() ==> Private key stream can't seek!"); } // Ищем начало потоков... publicKeyFromOtherPartyStream.SafeSeekBegin(); privateKeyStream.SafeSeekBegin(); // Создаем сущность для работы с эллиптическими кривыми var ecdhP521 = new EcdhP521(null, new StreamReader(privateKeyStream, Encoding.UTF8).ReadToEnd()) {PublicKeyFromOtherParty = new StreamReader(publicKeyFromOtherPartyStream, Encoding.UTF8).ReadToEnd()}; // Если не получилось сгенерировать симметричные ключи... if(!ecdhP521.CreateSymmetricKey()) { //...уничтожаем секретные данные... ecdhP521.Clear(); throw new Exception("EcdhP521::CreateSymmetricKey() failed!"); } // Получаем симметричные ключи symmetricKey1 = (byte[])ecdhP521.Keys256[0].Clone(); symmetricKey2 = (byte[])ecdhP521.Keys256[1].Clone(); // Уничтожаем секретные данные... ecdhP521.Clear(); }
/// <summary> /// Вычисление ЭЦП потока данных /// </summary> /// <param name="privateKeyStream">Приватный ключ.</param> /// <param name="dataStream">Поток данных.</param> /// <param name="signStream">ЭЦП для потока данных.</param> public void SignData(Stream privateKeyStream, Stream dataStream, Stream signStream) { if(!privateKeyStream.CanSeek) { throw new Exception("Cryforce::SignData() ==> Private key stream can't seek!"); } // Ищем начало потоков... privateKeyStream.SafeSeekBegin(); dataStream.SafeSeekBegin(); // Создаем сущность для работы с эллиптическими кривыми var ecdhP521 = new EcdhP521(null, new StreamReader(privateKeyStream, Encoding.UTF8).ReadToEnd()); // Пишем ЭЦП... var sw = new StreamWriter(signStream, Encoding.ASCII); sw.Write(ecdhP521.SignData(dataStream)); sw.Flush(); // Уничтожаем секретные данные... ecdhP521.Clear(); }
/// <summary> /// Генерация пары открытый/закрытый ключ /// </summary> /// <param name="publicKeyStream">Поток для записи открытого ключа.</param> /// <param name="privateKeyStream">Поток для записи закрытого ключа.</param> /// <param name="seedStream">Поток, содержащий случайные данные.</param> public void CreateEccKeys(Stream publicKeyStream, Stream privateKeyStream, Stream seedStream = null) { byte[] seedDataFromStream = null; if(!publicKeyStream.CanWrite) { throw new Exception("Cryforce::CreateEccKeys() ==> Public key stream can't write!"); } if(!privateKeyStream.CanWrite) { throw new Exception("Cryforce::CreateEccKeys() ==> Private key stream can't write!"); } // Если можем использовать seed-поток... if((seedStream != null) && (seedStream.CanSeek)) { seedStream.SafeSeekBegin(); seedDataFromStream = new byte[seedStream.Length]; seedStream.Read(seedDataFromStream, 0, seedDataFromStream.Length); } // ECDH Console.WriteLine("Генерирование пары открытый/закрытый ключ (ECDH, шифрование)."); Console.WriteLine("Нажимайте случайные клавиши на клавиатуре (включая модификаторы"); Console.WriteLine("\"Alt\", \"Shift\", \"Control\"). Для завершения нажмите Enter..."); Console.WriteLine(); byte[] seedDataFromKeyboard_ECDH = CryforceUtilities.GetPasswordBytesSafely(); Console.WriteLine(); byte[] seedData_ECDH = CryforceUtilities.MergeArrays(seedDataFromStream, seedDataFromKeyboard_ECDH); var ecdhP521_ECDH = new EcdhP521(seedData_ECDH, null); // Приватного ключа нет - он будет сгенерирован! // ECDSA Console.WriteLine("Генерирование пары открытый/закрытый ключ (ECDSA, ЭЦП)."); Console.WriteLine("Нажимайте случайные клавиши на клавиатуре (включая модификаторы"); Console.WriteLine("\"Alt\", \"Shift\", \"Control\"). Для завершения нажмите Enter..."); Console.WriteLine(); byte[] seedDataFromKeyboard_ECDSA = CryforceUtilities.GetPasswordBytesSafely(); byte[] seedData_ECDSA = CryforceUtilities.MergeArrays(seedDataFromStream, seedDataFromKeyboard_ECDSA); var ecdhP521_ECDSA = new EcdhP521(seedData_ECDSA, null); // Приватного ключа нет - он будет сгенерирован! // Чистим массивы... CryforceUtilities.ClearArray(seedDataFromStream); CryforceUtilities.ClearArray(seedDataFromKeyboard_ECDH); CryforceUtilities.ClearArray(seedDataFromKeyboard_ECDSA); CryforceUtilities.ClearArray(seedData_ECDH); CryforceUtilities.ClearArray(seedData_ECDSA); // Пишем открытые ключи... var swPublicKey = new StreamWriter(publicKeyStream, Encoding.ASCII); swPublicKey.Write("[ ;|;; "); swPublicKey.Write(ecdhP521_ECDH.PublicKey); swPublicKey.Write(" ;|;; "); swPublicKey.Write(ecdhP521_ECDSA.PublicKey); swPublicKey.Write(" ]"); swPublicKey.Flush(); // Пишем закрытые ключи... var swPrivateKey = new StreamWriter(privateKeyStream, Encoding.ASCII); swPrivateKey.Write("[ ( ; ) "); swPrivateKey.Write(ecdhP521_ECDH.PrivateKey); swPrivateKey.Write(" ( ; ) "); swPrivateKey.Write(ecdhP521_ECDSA.PrivateKey); swPrivateKey.Write(" ]"); swPrivateKey.Flush(); // Уничтожаем секретные данные... ecdhP521_ECDH.Clear(); ecdhP521_ECDSA.Clear(); }