Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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();
        }
Пример #3
0
        /// <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();
        }
Пример #4
0
        /// <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();
        }