AES加密和C#

从我的阅读中我不确定AES是否是一种可以使用不同长度密钥或一系列类似算法的单一标准化算法? 我的意思是,如果我发现任何2个AES实现采用128位密钥,我是否应该相信它们的工作方式相同(除了错误)?

特别是在.Net / C#中,我很困惑为什么有两个抽象基类System.Security.Cryptography.AesSystem.Security.Cryptography.AesCryptoServiceProviderSystem.Security.Cryptography.AesManaged

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

所有这些之间的区别是什么? 我注意到AES类似乎只存在于.NET 3.5之后,而Rijndael从1.0开始就存在

对不起,如果这些都是愚蠢的问题,除了安全散列函数之外,我是加密的新手。

AES,高级加密标准,在FIPS PUB 197中定义了三种对称分组密码:AES-128,AES-192和AES-256。 所有三种算法都由Rijndael算法的特定参数选择定义。

AES-128加密是一种function(密钥,数据) – >(加密)。 Rijndael-encryption是一种function(密钥,数据,块大小,密钥大小) – >(加密)。

AesCryptoServiceProvider使用基础Windows CryptoAPI执行加密。 AesManaged在纯托管代码中执行加密。 RijndaelManaged支持所有参数选择(也在纯托管代码中)。

使用AesCryptoServiceProvider优点包括提高速度的可能性以及CryptoAPI已通过FIPS认证(在某些版本的Windows上)。

AesManaged优点包括可移植性(所有版本的Windows都不支持AesCryptoServiceProvider )。

RijndaelManaged的唯一优势是早期版本的.NET框架支持它 – 我从未见过有人使用非AES参数选择。

以下内容来自AesCryptoServiceProvider MSDN页面。

Windows 7,Windows Vista SP1或更高版本,Windows XP SP3,Windows Server 2008(不支持服务器核心角色),Windows Server 2008 R2(不支持服务器核心角色),Windows Server 2003 SP2

.NET Framework不支持每个平台的所有版本。 有关受支持版本的列表,请参阅.NET Framework系统要求。

但事情是,我并没有真正理解为什么不支持它的原因。 .NET 3.5现在通常安装在Windows XP上,但在XP SP3之前可能有一些关于CLR的内容可能有所不同并阻止它正常工作。 在MSDN页面上确实没有足够的信息来推测甚至; 虽然。

至于你的问题,类之间的差异(再次来自MSDN)如下:

AesManaged

提供高级加密标准(AES)对称算法的托管实现。

AES算法本质上是Rijndael对称算法,具有固定的块大小和迭代计数。 此类的function与RijndaelManaged类的function相同,但将块限制为128位,并且不允许反馈模式。

AesCryptoServiceProvider

使用高级加密标准(AES)算法的加密应用程序编程接口(CAPI)实现执行对称加密和解密。

AES

表示高级加密标准(AES)的所有实现必须从中inheritance的抽象基类。

我一直坚持使用* CryptoServiceProvider实现,因为它们总是为我提供我想要的东西。 我建议的唯一一件事是,如果你想看看不同的类是否表现不同,就是编写一些测试用例和unit testing,并实际看到它的实际效果。

请注意,XP不支持这些function(甚至不支持XP SP3),因此如果XP支持很重要,则不应使用它们