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 加密字符串
algorithm - C# 中的 RijndaelManaged 类是不是等同于 AES 加密?