Rijndael密码术在Windows Server 2012上不起作用

我有一个Windows应用程序(x64),一直在Winodws 7,8和现在10工作正常。今天我们失败的Windows 2012服务器下运行的程序。 当我们查看事件日志时,发现源自System.Security.Cryptography.RijndaelManaged..ctor()的错误(不幸的是日志没有给出完整的path)。

我使用Rijndaelalgorithm来encryption程序中的敏感数据。 程序做的第一件事就是检索encryption的configuration文件并解密,以获得所有的设置。 而这正是我的程序无法启动的地方。

这是我的程序中的解密方法:

 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说明:由于未处理的exception,进程已终止。 exception信息:System.Security.Cryptography.RijndaelManaged..ctor()Common.Confluence(System.String,System.String)Common.Conf..cctor()上的System.InvalidOperationExceptionexceptionInfo:System.TypeInitializationException at Postbag.Program.Main()上的Postbag.FormMain..ctor()上的Common.Conf.get_DataProvider()

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

RijndaelManaged类不符合FIPS,您的服务器似乎具有安全策略系统加密:使用符合FIPS的算法进行加密,哈希和签名集。

在知识库文章“系统加密:使用FIPS兼容算法进行加密,哈希和签名”安全设置效果在Windows XP和更高版本的Windows中说:

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加密的数据可以用AesCngAesCryptoServiceProvider进行解密。

为了完成,我使用RijnDaelManaged类创建了一个加密方法,并在这一行上修改了代码示例:

 using (RijndaelManaged symmetricKey = new RijndaelManaged()) 

读书

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

并确实能够解密字符串。