RijndaelManaged .NET Framework 和 .NET Core 的区别

Posted

技术标签:

【中文标题】RijndaelManaged .NET Framework 和 .NET Core 的区别【英文标题】:RijndaelManaged difference in .NET Framework and .NET Core 【发布时间】:2021-11-17 12:33:51 【问题描述】:

我在两个项目中使用完全相同的类来加密/解密字符串,一个项目针对 .NET Framework 4.8 和第二个 .NET 5。我在使用 RijndaelManaged Algorithm 时遇到了非常奇怪的事情,在 .NET Framework 应用程序上它工作得非常好,但在 .NET 5 上它会抛出“Specified key is not a valid size for this algorithm”错误。

我的第一个问题是为什么 .NET Framework 应用程序中不会发生错误(我知道 System.Security.Cryptography dll 的版本因项目而异),我使用的密钥是 12 字节。正如我研究过的那样,RijndaelManaged 密钥在 .NET Framework 中仅接受 16/24/32 字节,在 .NET Core 中仅接受 16 字节,如此处的备注中所述 - https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rijndaelmanaged?view=net-5.0

this.key = Convert.FromBase64String(Convert.ToBase64String(Encoding.UTF8.GetBytes("qwertyuiopas")))

这就是我获取 key 字节数组的方式,它有 12 个字节长。

如何使这种加密在 .NET Core/5 应用程序中工作?

将不胜感激任何想法,提前致谢!

注意:我无法在 .NET Framework 应用程序中更改任何内容,我正在处理 .Net 5 项目,我需要获取有效的加密字符串,然后将在 .NET Framework 应用程序中解密。

【问题讨论】:

Convert.FromBase64String(Convert.ToBase64String(Encoding.UTF8.GetBytes("qwertyuiopas"))) - 问题:为什么要获取表示 UTF8 编码字符串的字节,将其转换为 base64,然后再将其转换回字节数组? someData = Convert.FromBase64String(Convert.ToBase64String(someData)); 实际上不是无操作吗? 一些在家中的观众可以编译以重现(和诊断)问题的代码会有所帮助。问题的文字描述并不总是准确地传达问题。 我已经检查过了,这个键在 .NET 4.8 中也不起作用,除了同样的例外(应该如此)。 啊,CreateEncryptor...然后看看这个答案:***.com/a/47442885/5311735 基本上你的 NET 4.8 应用程序有一个错误并且使用了无效的密钥,所以没有真正使用 Rijndael 加密\解密,而 .NET 反过来有一个允许你这样做的错误。解决此问题的唯一方法是修复 .NET 4.8 应用程序。 【参考方案1】:

如果您希望密钥具有固定字节大小,请按此创建,然后将其转换为 base 64 以便于存储。

如果需要,您可以在单独的控制台应用程序中执行此操作。比如:

var rng = new RNGCryptoServiceProvider();

var key = new byte[16];
rng.GetNonZeroBytes(key);

var base64Key = Convert.ToBase64String(key);

return base64Key;

【讨论】:

以上是关于RijndaelManaged .NET Framework 和 .NET Core 的区别的主要内容,如果未能解决你的问题,请参考以下文章

AesManaged 与 RijndaelManaged [关闭]

使用 CryptDecrypt 解密 RijndaelManaged 加密字符串

为啥我不能使用 RijndaelManaged 解密数据?

algorithm - C# 中的 RijndaelManaged 类是不是等同于 AES 加密?

RijndaelManaged 与 AesCryptoServiceProvider(AES 加密)

使用 RijndaelManaged 在 C# 中加密/解密流