Rijndael加密技术无法在Windows Server 2012上运行

dis*_*kid 2 c# windows encryption rijndaelmanaged windows2012

我有一个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);
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在日志中收到的错误消息:

应用程序:Postbag.exe框架版本:v4.0.30319描述:由于未处理的异常,进程终止.异常信息:Common.Conf..cctor()上Common.StringCipher.Decrypt(System.String,System.String)的System.Security.Cryptography.RijndaelManaged..ctor()的System.InvalidOperationException异常信息:System.TypeInitializationException at at Postbag.Program.Main()中Postbag.FormMain..ctor()的Common.Conf.get_DataProvider()

新服务器也具有相同版本的.Net框架.

ren*_*ene 6

RijndaelManaged条款不符合FIPS,您的服务器似乎具有安全策略系统加密:使用符合FIPS标准的算法进行加密,散列和签名集.

在知识库中,在Windows XP和更高版本的Windows中使用"系统加密:使用FIPS兼容算法进行加密,散列和签名"安全设置效果,它说:

Microsoft .NET Framework应用程序(如Microsoft ASP.NET)仅允许使用经NIST认证的算法实现符合FIPS 140标准.具体而言,可以实例化的唯一加密算法类是实现符合FIPS的算法的加密算法类.这些类的名称以"CryptoServiceProvider"或"Cng"结尾.任何创建其他加密算法类实例的尝试(例如名称以"Managed"结尾的类)都会导致发生InvalidOperationException异常

因此,要么禁用安全策略(来自SecPol.msc工具),要么使用符合FIPS的实现.不幸的是Rijndael算法没有这样执行,所以你可能想看看AesCngAesCryptoServiceProvider满足你的需要,因为AES是正式实施的是什么开始作为Rijndael算法.基于博客是否符合RijndaelManaged类FIPS?来自Prateek Kr Dubey我得出结论,加密的数据RijdaelManaged可以用AesCng或解密AesCryptoServiceProvider.

为了完成,我使用RijnDaelManaged类创建了一个Encrypt方法,并在此行上调整了您的代码示例:

using (RijndaelManaged symmetricKey = new RijndaelManaged())
Run Code Online (Sandbox Code Playgroud)

阅读

using (var symmetricKey = new AesCryptoServiceProvider()) // or new AesCng()
Run Code Online (Sandbox Code Playgroud)

并确实能够解密字符串.