AES合法密钥大小真的是限制吗
本文关键字:真的 密钥 AES | 更新日期: 2023-09-27 17:59:49
AesCryptoServiceProvider.LegalKeySizes
字段显示允许的位大小。
然而,我不明白的是,如果这些都是真的,我如何才能成功利用2048位密钥长度(256字节)?
我想我真正的问题是,我的密钥是否按照要求的大小(大于最大32字节)生成,但在加密/解密过程中实际上只使用了前32字节(256位),从而使较大的密钥大小浪费了空间?
我不知道是否有一种方法可以从API中暴露的内容中辨别。。。
有什么想法吗?也许我看错了方向?
AES可用于3种密钥大小:128、192和256位密钥。基本上,如果您能够使用比256位更大的密钥,那么库就是在"欺骗您",即较大密钥的某些位被丢弃或以某种方式压缩。例如,PHP mcrypt
只是将键的大小缩小到尽可能大的大小。
较大的密钥"种子"在密码学世界中相当常见。例如,Diffie-Hellman(一种密钥协商算法)通常会生成一个大于所需密钥大小的秘密。因此,提取(集中)密钥中的熵量的问题经常出现。如果比特被截断,那么这些比特中的熵被丢弃。
所以在现代密码学中实际使用的是一个KDF,一个密钥派生函数。如果输入-种子-是密码,那么应该使用PBKDF(基于密码的KDF)。现代PBKDF有PBKDF2、bcrypt、scrypt和Argon2。
如果输入已经是一个密钥——如果把数据放在一起,它会提供足够的熵(随机性)——那么你应该使用KBKDF(基于密钥的KDF)。一个现代的KBKDF就是香港发展基金。请注意,这些算法需要额外的输入,因此如果没有提供额外的数据,则很可能会简单地忽略额外的密钥位。
AES-128的加密强度当然是并且保持在128比特。只要攻击者无法将这些比特与随机比特区分开来,AES-128就应该为实际需求提供足够的安全性。如果你害怕量子密码学的突破,可以使用AES-256。
因此,对于答案:"AES合法密钥大小真的是限制吗?"答案是响亮的是。2048比特密钥大小更常见于诸如RSA/DSA之类的非对称算法。对于RSA和DSA来说,密钥大小实际上相当低,尽管实际攻击仍然无法访问它。也许密文是使用混合加密进行加密的。
您可以在Rijndael(AES所基于的加密算法)中使用更大的密钥大小,通常达到库定义的限制。但是,对于AES,您只能使用128、192或256位的密钥大小。一些实现可以使用字节阵列或比特流(通常是C/C++)的前X个比特(其中is是128、192或256比特的密钥大小)。正如@Blorgbeard在他的评论中提到的那样,Net基类库(BCL)实现没有。
编辑:为了澄清Rijndael和AES之间的关系,AES是由美国国家标准与技术研究所(NIST)(准确地说是FIPS 197)创建的规范,定义了Rijndael的子集。AES包含在FIPS 140-2中,这意味着它被美国政府部门批准用于某些用途。