RijndaelManaged 与 AesCryptoServiceProvider(AES 加密)

Posted

技术标签:

【中文标题】RijndaelManaged 与 AesCryptoServiceProvider(AES 加密)【英文标题】:RijndaelManaged vs AesCryptoServiceProvider (AES Encryption) 【发布时间】:2012-11-09 06:46:04 【问题描述】:

我需要使用 AES 加密数据。在研究过程中,我发现了 AesCryptoServiceProvider 类。

我对加密知之甚少,也不知道初始化向量 (IV) 是什么,因此我尝试在堆栈溢出中搜索 AES 示例,这导致我找到了this question。

为什么堆栈溢出链接使用 RijndaelManaged 类? RijndaelManaged 和 AesCryptoServiceProvider 类做同样的事情吗?

【问题讨论】:

不,他们没有做同样的事情。见***.com/a/4863924/328397 Why are RijndaelManaged and AesCryptoServiceProvider returning different results?的可能重复 【参考方案1】:

AES 基于 Rijndael,但块大小限制为 128 位。 Rijndael 支持更广泛的块大小,许多加密库提供单独的 Rijndael 实现来补充 AES。

Rijndael 算法支持 128、160、192、224 和 256 位的块大小,但 AES 标准中仅指定了 128 位的块大小。 [Wikipedia]

您已链接到 RijndaelManaged 类。 AES 的等效类是AesManaged

关于类之间的区别:AesManaged 仅使用 RijndaelManaged 并将块大小设置为 128。AesManagedRijndaelManaged 不符合 FIPS,如果 FIPS 组策略标志使用时将引发异常已设置。 .NET Framework 4.6.2(2016 年 8 月)添加了 AesCng 类,这是 AES 算法的 CNG 版本的实现。

An IV 是一段随机数据,长度等于块大小,这是某些对称操作模式(例如 CBC 模式)所要求的。通常,IV 与第一个明文块或第一个密文块组合(异或)。这个想法是为了确保使用相同的密钥对相同的消息进行两次加密不会导致相同的输出。

【讨论】:

非常感谢邓肯。我如何指定块大小?例如,您提到 Rijndael 支持更广泛的块大小,例如 255 位。那是由IV密钥的长度决定的吗?如果我传递一个 16 字节的密钥,我将使用 128 位加密如果我传递一个 32 字节的 IV 密钥,我将使用 256 位加密? 我不确定 - 我自己没有使用过这些课程。如果我不得不猜测,如果不是从 IV 长度推断出来的,您可能需要手动设置 BlockSize 属性。 关于AesManaged,您关于差异的最后陈述是非常错误的。 AesManaged 仅使用 RijndaelManaged 并将块大小设置为 128。AesManaged 也不符合 FIPS,如果设置了 FIPS 组策略标志,则会引发异常。目前 .NET 中不支持 CNG 版本的 AES 算法。 XOR'd *。通常,IV 是xored,第一个块;不是 OR'd。 @TonoNam AES 使用 128 位 block 大小。使用 128 位块大小,您可以使用 256 位 keys

以上是关于RijndaelManaged 与 AesCryptoServiceProvider(AES 加密)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

使用 CryptDecrypt 解密 RijndaelManaged 加密字符串

让 .NET 中的 SlowAES 和 RijndaelManaged 类一起玩

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

RijndaelManaged 施工期间的奇怪行为