.NET迁移到Core时RijndaelManaged 256位块大小解密报错如何解决
问题原因
.NET Core 中的RijndaelManaged类仅实现了符合AES标准的Rijndael变种,AES固定块大小为128位,所以你手动设置BlockSize = 256就会抛出PlatformNotSupportedException异常,这是框架设计上的兼容限制。
无需重加密的可行解决方案
方案1:使用 Rijndael 基类创建实例(适用于 Windows 环境部署)
如果你是在Windows系统部署.NET Core/.NET 5+应用,可以直接把代码里的new RijndaelManaged()替换为Rijndael.Create(),这个方法返回的实例支持自定义块大小到256位,不需要改其他逻辑,解密出来的结果和原.NET Framework完全一致。
修改后的代码片段:
// 替换原来的 using (RijndaelManaged symmetricKey = new RijndaelManaged()) using (Rijndael symmetricKey = Rijndael.Create()) { symmetricKey.BlockSize = 256; symmetricKey.Mode = CipherMode.CBC; symmetricKey.Padding = PaddingMode.PKCS7; // 其余逻辑完全不变 }
注意:这个方案仅在Windows环境生效,跨平台部署到Linux/macOS时还是会触发块大小限制报错
方案2:使用BouncyCastle加密库(全平台兼容)
如果需要跨平台部署,建议引入Portable.BouncyCastle Nuget包,用BouncyCastle的Rijndael实现来完成解密,完全兼容原有256块大小的加密结果,不需要修改数据库里的任何密文。
对应的解密函数参考实现:
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; public static string DecryptString(string cipherText) { string passPhrase = EncryptingKey(EncKey); byte[] cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText); byte[] saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray(); byte[] ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray(); byte[] cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray(); using (Rfc2898DeriveBytes password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations)) { byte[] keyBytes = password.GetBytes(Keysize / 8); // 替换原有RijndaelManaged逻辑,用BouncyCastle实现 IBufferedCipher cipher = CipherUtilities.GetCipher("Rijndael/CBC/PKCS7Padding"); cipher.Init(false, new ParametersWithIV(new KeyParameter(keyBytes), ivStringBytes)); byte[] plainTextBytes = cipher.DoFinal(cipherTextBytes); return Encoding.UTF8.GetString(plainTextBytes); } }
这个方案在Windows、Linux、macOS下都能正常运行,解密结果和原有.NET Framework的实现完全一致,不需要对已存储的密文做任何修改。
内容的提问来源于stack exchange,提问作者APearTree
相关产品推荐
相关产品推荐

