AES加密与C#

18

通过我的阅读,我不确定 AES 是一种可以使用不同长度的密钥工作的单一标准算法,还是一组相似算法?我的意思是,如果我找到任何两个接受 128 位密钥的 AES 实现,我是否能确信它们将完全相同(除了错误)?

特别是在 .NET/C# 中,我对抽象基类 System.Security.Cryptography.Aes 的两个实现感到困惑:System.Security.Cryptography.AesCryptoServiceProviderSystem.Security.Cryptography.AesManaged

然后似乎有 AES 和 Rijndael 之间的区别/重叠,.NET 有 RijndaelRijndaelManaged 类,以及 RijndaelManagedTransform

这些之间有什么区别?我注意到 AES 类似乎只存在于 .NET 3.5 以后,而 Rijndael 从 1.0 就已经存在了。

如果这些问题很愚蠢,请原谅,除了安全哈希函数之外,我对加密领域很陌生。

2个回答

27
AES,即高级加密标准,由FIPS PUB 197定义了三种对称分组密码:AES-128、AES-192和AES-256。这三种算法都是通过特定的参数选择来定义Rijndael算法的。
AES-128加密是一个函数(密钥,数据) ->(加密)。 Rijndael加密是一个函数(密钥,数据,块大小,密钥大小) ->(加密)。 AesCryptoServiceProvider使用底层的Windows CryptoAPI执行加密。 AesManaged在纯托管代码中执行加密。 RijndaelManaged支持全范围的参数选择(也在纯托管代码中)。
使用AesCryptoServiceProvider的优点包括潜在的更高速度以及CryptoAPI在某些版本的Windows上获得了FIPS认证。
使用AesManaged的优点包括可移植性(AesCryptoServiceProvider不受所有Windows版本的支持)。 RijndaelManaged的唯一优点是它在早期版本的.NET框架中得到了支持 - 我从未见过任何人使用非AES参数选择。

如上所述,关于FIPS认证,AesCryptoServiceProvider将在.NET应用程序运行在配置有“使用FIPS兼容算法”的本地安全策略的PC上的情况下工作。而AesManaged则不会。例如,在配置为美国政府的Windows 10 PC上运行的应用程序将具有此设置,并且在使用AesManged时会抛出异常或失败(错误消息:此实现不是Windows平台FIPS验证的加密算法的一部分)。 - Ben Butzer

3
以下内容来自AesCryptoServiceProvider MSDN页面。
Windows 7,Windows Vista SP1或更高版本,Windows XP SP3,Windows Server 2008(不支持Server Core角色),Windows Server 2008 R2(不支持Server Core角色),Windows Server 2003 SP2
.NET Framework不支持所有平台的所有版本。有关支持的版本列表,请参见.NET Framework系统要求。
然而,我真的看不出为什么它不受支持。.NET 3.5现在通常安装在Windows XP上,但CLR XP SP3之前可能有所不同,阻止其正常工作。即使从MSDN页面也没有足够的信息来推测。
至于你的问题,以下是类之间的区别(再次引用自MSDN):
AesManaged
提供了高级加密标准(AES)对称算法的托管实现。
AES算法本质上是Rijndael对称算法,具有固定的块大小和迭代次数。该类与RijndaelManaged类的功能相同,但将块限制为128位,并且不允许反馈模式。
AesCryptoServiceProvider 使用高级加密标准(AES)算法的Cryptographic Application Programming Interfaces(CAPI)实现执行对称加密和解密。
Aes
表示所有高级加密标准(AES)实现必须继承的抽象基类。
我一直坚持使用*CryptoServiceProvider实现,因为它们总是为我提供所需的功能。我唯一建议的是编写一些测试用例和单元测试,以查看不同类是否表现不同,并实际上将其动起来。

只有在“平台”中提到SP3,因为你无法在SP2上安装.NET 4。您可以切换到页面的3.5版本,它会提到SP2。 - wRAR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接