Криптография Rijndael не работает на Windows Server 2012

У меня есть приложение Windows (x64), которое отлично работает на Winodws 7, 8 и теперь 10. Сегодня нам не удалось запустить программу под Windows 2012 Server. Когда мы просмотрели журнал событий, мы обнаружили ошибку, происходящую от System.Security.Cryptography.RijndaelManaged..ctor() (к сожалению, журнал не дал нам полного пути).

Я использовал алгоритм Rijndael для шифрования конфиденциальных данных в своей программе. Первое, что делает программа, — извлекает зашифрованный файл конфигурации и расшифровывает его, чтобы получить все настройки. И вот тут у меня программа не запускается.

Это метод расшифровки в моей программе:

public static string Decrypt(string cipherText, string passPhrase)
{
    byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
    using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null))
    {
        byte[] keyBytes = password.GetBytes(keysize / 8);
        using (RijndaelManaged symmetricKey = new RijndaelManaged())
        {
            symmetricKey.Mode = CipherMode.CBC;
            using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes))
            {
                using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                    {
                        byte[] plainTextBytes = new byte[cipherTextBytes.Length];
                        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
                    }
                }
            }
        }
    }
}

И это сообщение об ошибке, которое я получаю в журнале:

Приложение: Postbag.exe Framework Версия: v4.0.30319 Описание: Процесс был прерван из-за необработанного исключения. Информация об исключении: System.InvalidOperationException в System.Security.Cryptography.RijndaelManaged..ctor() в Common.StringCipher.Decrypt(System.String, System.String) в Common.Conf..cctor() Информация об исключении: System.TypeInitializationException в Common.Conf.get_DataProvider() в Postbag.FormMain..ctor() в Postbag.Program.Main()

Новый сервер также имеет те же версии .Net framework.


person disasterkid    schedule 19.09.2017    source источник
comment
Поскольку вы не меняете размер блока, вам следует просто заменить new RijndaelManaged() на Aes.Create(). Он выдаст тот же результат, но не будет иметь исключения FIPS.   -  person bartonjs    schedule 19.09.2017


Ответы (1)


Классы RijndaelManaged не соответствуют требованиям FIPS, и на вашем сервере, похоже, установлена ​​политика безопасности Системная криптография: использовать алгоритмы, совместимые с FIPS, для шифрования, хеширования и подписи.

В статье базы знаний "Системная криптография: используйте алгоритмы, совместимые с FIPS, для шифрования, хеширования и подписи" установка эффектов в Windows XP и более поздних версиях Windows говорит:

Приложения Microsoft .NET Framework, такие как Microsoft ASP.NET, позволяют использовать только реализации алгоритмов, которые сертифицированы NIST как совместимые с FIPS 140. В частности, могут быть созданы экземпляры только тех классов криптографических алгоритмов, которые реализуют алгоритмы, совместимые с FIPS. Имена этих классов заканчиваются на «CryptoServiceProvider» или «Cng». Любая попытка создать экземпляр других классов криптографических алгоритмов, таких как классы с именами, оканчивающимися на «Управляемый», вызывает исключение InvalidOperationException.

Поэтому либо отключите политику безопасности (из инструмента SecPol.msc), либо используйте FIPS-совместимый реализация. К сожалению, у Rijndael нет такой реализации, поэтому вы можете посмотреть, не AesCng или AesCryptoServiceProvider соответствует вашим потребностям, поскольку AES — это формальная реализация того, что началось как Rijndael. На основе блог соответствует классу FIPS RijndaelManaged. соответствует требованиям? из Prateek Kr Dubey я делаю вывод, что данные, зашифрован с помощью RijdaelManaged, может быть расшифрован с помощью AesCng или AesCryptoServiceProvider.

Чтобы быть полным, я создал метод Encrypt с классом RijnDaelManaged и адаптировал ваш пример кода в этой строке:

using (RijndaelManaged symmetricKey = new RijndaelManaged())

читать

using (var symmetricKey = new AesCryptoServiceProvider()) // or new AesCng()

и действительно смог расшифровать строку.

person rene    schedule 19.09.2017
comment
Спасибо за информацию. Но как я могу отключить политику безопасности? - person disasterkid; 19.09.2017
comment
Я связал его в разделе отключить политику безопасности, но вот и он: i.stack.imgur.com/bSsH0.png - person rene; 19.09.2017
comment
Благодарю за ваш ответ. позвольте мне попробовать удалить политику с сервера и повторить попытку. я не думаю, что внесение изменений в программу в настоящее время возможно, так как это локальное решение, и применение изменений потребует много обновлений. но как только клиент удалит полис и я вернусь сюда. - person disasterkid; 19.09.2017
comment
В итоге мы отключили политику безопасности. - person disasterkid; 19.09.2017