You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:57:04