Example #1
0
        /// <summary>
        /// Шифрует открытый текст, используя режим Encrypt-MAC через шифра Rijndael в
        /// CBC с паролем, полученным из соли HMAC SHA-512.
        /// </summary>
        /// <param name="plaintext">Открытый текст для шифрования.</param>
        /// <param name="password">Пароль для шифрования открытого текста.</param>
        /// <param name="iv">Вектор инициализации. Должно быть 128 бит.</param>
        /// <param name="keySize">Размер ключа шифрования. 256-бит сильнее, но медленнее.</param>
        /// <returns>Шифрованный текст.</returns>
        public new byte[] Encrypt(byte[] plaintext, string password, byte[] iv, KeySize keySize)
        {
            // Создание ключей AE
            var keyRing = ring.Generate(password);

            // Шифровать открытый текст
            var ciphertext = Encrypt(plaintext, keyRing.CipherKey, iv, keySize);

            // Вычислить MAC из зашифрованного текста
            var mac = CalculateMac(ciphertext, keyRing.MacKey);

            // Добавить MAC в зашифрованный текст
            var etmCiphertext = new byte[ciphertext.Length + mac.Length];

            Buffer.BlockCopy(ciphertext, 0, etmCiphertext, 0, ciphertext.Length);
            Buffer.BlockCopy(mac, 0, etmCiphertext, ciphertext.Length, mac.Length);

            // IV + Cipher + MAC
            return(etmCiphertext);
        }