AesCryptoServiceProvider.LegalKeySizes
字段以位为单位显示允许的大小。
然而,我不明白的是,如果这些是真的,我怎么能成功利用2048位密钥长度(256字节)?
我想我真正的问题是,我的密钥是否产生了所请求的大小(大于最大32字节),但是在加密/解密过程中实际只采用了前32字节(256位),更大的密钥大小浪费空间?
我不知道是否有办法实际告知API中的内容......
有什么想法?也许我以错误的方式看待这个?
答案 0 :(得分:6)
AES可用于3种密钥大小:128,192和256位密钥。基本上,如果你能够使用比256位更大的密钥,那么这个库就会对你说谎"即,以某种方式丢弃或压缩较大密钥的一些比特。例如,PHP mcrypt
只是将密钥的大小缩小到最大可能的大小。
更大的关键"种子"在密码学领域相当普遍。例如,Diffie-Hellman--一种密钥协商算法 - 通常生成一个大于所需密钥大小的秘密。因此,经常出现提取(集中)密钥中的熵量的问题。如果比特被截断,则丢弃那些比特中的熵。
因此,现代密码学中实际使用的是KDF,即密钥派生函数。如果输入 - 种子 - 是密码,则应使用PBKDF(基于密码的KDF)。现代PBKDF是PBKDF2,bcrypt,scrypt和Argon2。
如果输入已经是一个密钥 - 如果一起提供足够的熵(随机性)的数据 - 你应该使用KBKDF(基于密钥的KDF)。现代KBKDF例如是HKDF。请注意,这些算法需要额外的输入,因此如果没有提供额外的数据,则很可能只是忽略了额外的关键位。
AES-128的加密强度当然是128位。只要这些位与攻击者无法区分,AES-128 should provide enough security for practical needs。如果您担心量子密码学的突破,可以使用AES-256。
所以答案是:" AES合法密钥大小真的是限制吗?"答案是响亮的是。对于非对称算法(如RSA / DSA),更常见的是2048位密钥大小。对于RSA和DSA,密钥大小实际上相当低,即使实际攻击仍然无法实现。也许密文是使用hybrid encryption加密的。
答案 1 :(得分:1)
您可以使用larger key sizes with Rijndael,AES所基于的加密算法,通常达到某些库定义的限制。但是,您只能使用带有AES的128,192或256位密钥大小。某些实现可能使用字节数组或位流(通常是C / C ++)的前X位(其中是128,192或256位的密钥大小),但.Net基类库(BCL)实现不正如@Blorgbeard在评论中提到的那样。
编辑:为了阐明Rijndael和AES之间的关系,AES是由美国National Institute of Standards and Technology (NIST)(确切地说是FIPS 197)创建的规范,它定义了Rijndael的子集。 AES包含在FIPS 140-2中,这意味着它已被美国政府部门批准用于某些用途。