9

AesCryptoServiceProvider.LegalKeySizes字段以位为单位显示允许的大小。

但是我不明白的是,如果这些是真的,我如何能够成功利用 2048 位密钥长度(256 字节)?

我想我真正的问题是,我的密钥是否生成到请求的大小(大于最大 32 字节),但是实际上只有前 32 个字节(256 位)被用于加密/解密过程,从而呈现更大的密钥大小浪费空间?

我不知道是否有一种方法可以从 API 中公开的内容中真正分辨出来......

有什么想法吗?也许我以错误的方式看待这个?

4

2 回答 2

7

AES 可用于 3 种密钥大小:128、192 和 256 位密钥。基本上,如果您能够使用大于 256 位的密钥,那么该库就是在“对您撒谎”,即较大密钥的某些位以某种方式被丢弃或压缩。例如,PHPmcrypt只是将键的大小缩减到可能的最大大小。

较大的密钥“种子”在密码学领域相当普遍。例如,Diffie-Hellman - 一种密钥协商算法 - 通常会生成一个大于所需密钥大小的秘密。因此,经常会出现提取(集中)密钥中的熵量的问题。如果位被截断,则这些位中的熵将被丢弃。

因此,现代密码学中实际使用的是 KDF,即密钥派生函数。如果输入 - 种子 - 是密码,您应该使用 PBKDF(基于密码的 KDF)。现代 PBKDF 是 PBKDF2、bcrypt、scrypt 和 Argon2。

如果输入已经是一个键——如果数据一起提供足够的熵(随机性)——你应该使用 KBKDF(基于键的 KDF)。现代的 KBKDF 是例如 HKDF。请注意,这些算法需要额外的输入,因此如果没有提供额外的数据,则很可能会简单地忽略额外的密钥位。

AES-128 的加密强度当然是 128 位。只要攻击者无法区分这些位与随机位,AES-128 就应该为实际需要提供足够的安全性。如果您担心量子密码学的突破,可以使用 AES-256。


所以对于答案:“AES 合法密钥大小真的是限制吗?” 答案是肯定的。2048 位密钥大小更常见于 RSA / DSA 等非对称算法。对于 RSA 和 DSA 而言,密钥大小实际上相当小,即使它对于实际攻击来说仍然是遥不可及的。也许密文是使用混合加密加密的。

于 2014-04-24T05:15:56.510 回答
1

您可以将更大的密钥大小与 Rijndael 一起使用,这是 AES 所基于的加密算法,通常达到某个库定义的限制。但是,您只能在 AES 中使用 128、192 或 256 位的密钥大小。某些实现可能使用字节数组或位流(通常是 C/C++ 的)的前 X 位(其中是 128、192 或 256 位的密钥大小),但 .Net 基类库 (BCL) 实现不,正如@Blorgbeard 在他的评论中提到的那样。

编辑:为了阐明Rijndael和 AES之间的关系,AES 是由美国国家标准与技术研究院 (NIST)创建的规范(准确地说是FIPS 197),它定义了 Rijndael 的一个子集。AES 包含在FIPS 140-2中,这意味着它已被美国政府部门批准用于某些用途。

于 2014-04-24T05:23:58.883 回答